实验4 8086标志寄存器及中断
1. 实验任务1
task1.asm源码
1 assume cs:code, ds:data 2 3 data segment 4 x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h 5 y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h 6 data ends 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov si, offset x 12 mov di, offset y 13 call add128 14 15 mov ah, 4ch 16 int 21h 17 18 add128: 19 push ax 20 push cx 21 push si 22 push di 23 24 sub ax, ax 25 26 mov cx, 8 27 s: mov ax, [si] 28 adc ax, [di] 29 mov [si], ax 30 31 inc si 32 inc si 33 inc di 34 inc di 35 loop s 36 37 pop di 38 pop si 39 pop cx 40 pop ax 41 ret 42 code ends 43 end start
回答问题 line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
1 add si, 2 2 add di, 2
不能,inc si 是把si+1的值再送给si,这里的1与add si,1移到下一个数不同,而是移动一个字节。
也就是说inc不会改变si的值,而add则会改变si的值。
在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截 图。
数据段中做128位加之前

数据段中做128位加之后

2. 实验任务2
程序task2.asm源码
1 assume cs:code, ds:data 2 data segment 3 str db 80 dup(?) 4 data ends 5 6 code segment 7 start: 8 mov ax, data 9 mov ds, ax 10 mov si, 0 11 s1: 12 mov ah, 1 13 int 21h 14 mov [si], al 15 cmp al, '#' 16 je next 17 inc si 18 jmp s1 19 next: 20 mov ah, 2 21 mov dl, 0ah 22 int 21h 23 24 mov cx, si 25 mov si, 0 26 s2: mov ah, 2 27 mov dl, [si] 28 int 21h 29 inc si 30 loop s2 31 32 mov ah, 4ch 33 int 21h 34 code ends 35 end start
运行测试截图

回答问题
运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结 果。结合运行结果,理解代码并回答问题:

① 汇编指令代码line11-18,实现的功能是?
输入字符直到#结束
② 汇编指令代码line20-22,实现的功能是?
换行
③ 汇编指令代码line24-30,实现的功能是?
输出输入字符在#之前结束
3. 实验任务3
task3.asm源码
1 assume ds:data, cs:code 2 3 data segment 4 x dw 91, 792, 8536, 65521, 2021,12 5 len equ $ - x 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 13 mov cx, len/2 14 15 s: 16 mov ax,ds:[di] 17 add di, 2 18 19 push cx 20 21 call printNumber 22 call printSpace 23 24 pop cx 25 loop s 26 27 mov ah, 4ch 28 int 21h 29 30 printNumber: 31 mov bx, 0 32 33 s1: 34 mov si, 10 35 mov dx, 0 36 div si 37 38 push dx 39 inc bx 40 41 cmp ax,0 42 jne s1 43 44 45 mov cx, bx 46 47 s2: 48 pop dx 49 add dl, 30h 50 mov ah, 2 51 int 21h 52 loop s2 53 54 ret 55 56 57 printSpace: 58 mov ah, 2 59 mov dl, 20h 60 int 21h 61 ret 62 63 code ends 64 end start
运行测试截图

4. 实验任务4
task4.asm源码
1 assume cs:code,ds:data 2 data segment 3 str db "assembly language, it's not difficult but tedious" 4 len equ $ - str 5 data ends 6 7 stack segment 8 db 8 dup(?) 9 stack ends 10 11 code segment 12 start: 13 mov ax, data 14 mov ds, ax 15 mov si, 0 16 mov cx, len 17 call strupr 18 call printStr 19 20 mov ax, 4c00h 21 int 21h 22 23 24 strupr: 25 push cx 26 push si 27 transform: 28 mov al, ds:[si] 29 cmp al, 97 30 jl continue 31 cmp al, 122 32 jg continue 33 and al, 0dfh 34 mov ds:[si], al 35 continue: 36 inc si 37 loop transform 38 39 pop si 40 pop cx 41 ret 42 43 44 printStr: 45 push cx 46 push si 47 48 print: 49 mov ah, 2 50 mov dl, ds:[si] 51 int 21h 52 inc si 53 loop print 54 55 pop si 56 pop cx 57 ret 58 59 code ends 60 end start

在debug中调试截图( call strupr 调用之前,数据段的值,以及,调用之后,数据段的值)
call strupr 调用之前

call strupr 调用之后

5. 实验任务5 使用任意文本编辑器,录入8086汇编源码task5.asm。 task5.asm
1 assume cs:code, ds:data 2 data segment 3 str1 db "yes", '$' 4 str2 db "no", '$' 5 data ends 6 code segment 7 start: 8 mov ax, data 9 mov ds, ax 10 mov ah, 1 11 int 21h ; 从键盘输入字符 12 mov ah, 2 13 mov bh, 0 14 mov dh, 24 ; 设置光标位置在第24行 15 mov dl, 70 ; 设置光标位置在第70列 16 int 10h ; 设置光标位置 17 cmp al, '7' 18 je s1 19 mov ah, 9 20 mov dx, offset str2 21 int 21h ; 显示标号str2处的字符串 22 jmp over 23 s1: mov ah, 9 24 mov dx, offset str1 25 int 21h ; 显示标号str2处的字符串 26 over: 27 mov ah, 4ch 28 int 21h 29 code ends 30 end start
对源程序task5.asm进行汇编、链接,得到可执行文件task5.exe。
程序运行测试截图(输入7,以及输入其他字符,运行结果截图)

程序的功能是?
经猜测,且经过多次测试,该程序功能是判断字符是否为7,是则输出yes,反之输出no;

浙公网安备 33010602011771号