实验4 8086标志寄存器及中断
1. 实验任务1
task1.asm源码:
1 assume cs:code, ds:data 2 data segment 3 x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h 4 y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h 5 data ends 6 code segment 7 start: 8 mov ax, data 9 mov ds, ax 10 mov si, offset x 11 mov di, offset y 12 call add128 13 mov ah, 4ch 14 int 21h 15 add128: 16 push ax 17 push cx 18 push si 19 push di 20 sub ax, ax 21 mov cx, 8 22 s: mov ax, [si] 23 adc ax, [di] 24 mov [si], ax 25 inc si 26 inc si 27 inc di 28 inc di 29 loop s 30 pop di 31 pop si 32 pop cx 33 pop ax 34 ret 35 code ends 36 end start
① add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
答:add指令对ZF、CF都有影响
② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
答:inc指令对ZF有影响,但是对CF没有影响
回答问题
(1)line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
1 add si, 2 2 add di, 2
答:不可以,因为add指令会改变标志寄存器的值。
(2)在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截
图。
加之前:
加之后:
2. 实验任务2
程序task2.asm源码:
1 assume cs:code, ds:data 2 data segment 3 str db 80 dup(?) 4 data ends 5 code segment 6 start: 7 mov ax, data 8 mov ds, ax 9 mov si, 0 10 s1: 11 mov ah, 1 12 int 21h 13 mov [si], al 14 cmp al, '#' 15 je next 16 inc si 17 jmp s1 18 next: 19 mov ah, 2 20 mov dl, 0ah 21 int 21h 22 23 mov cx, si 24 mov si, 0 25 s2: mov ah, 2 26 mov dl, [si] 27 int 21h 28 inc si 29 loop s2 30 mov ah, 4ch 31 int 21h 32 code ends 33 end start
运行测试截图:
回答问题:
运行程序,从键盘上输入一串字符,以#结束(比如,输入George Orwell, 1984#),观察结
果。结合运行结果,理解代码并回答问题:
① 汇编指令代码line11-18,实现的功能是?
答:输入字符,判断是否等于#,如果等于#就je next跳转到next;如果不等于#就jmp s1 跳转到s1继续输入字符。
② 汇编指令代码line20-22,实现的功能是?
答:oah表示换行,实现换行。
③ 汇编指令代码line24-30,实现的功能是?
答:按顺序逐个输出刚才输入的字符。
3. 实验任务3
task3.asm源码:
1 data segment 2 x dw 91, 792, 8536, 65521, 2021 3 len equ $ - x 4 data ends
运行测试截图:
4. 实验任务4
task4.asm源码:
1 data segment 2 str db "assembly language, it's not difficult but tedious" 3 len equ $ - str 4 data ends
编写8086汇编源程序task4.asm,将data段中字符串里的小写字符转换成大写。
要求:
编写子程序strupr
功能:将包含任意字符的字符串中的小写字母变成大写
入口参数
(ds:si ) 字符串首地址的段地址和偏移地址分别送至ds和si
(cx) 字符串的长度
出口参数:无
在主体代码中,设置入口参数,调用strupr, 实现题目要求。
完整代码如下:
1 assume cs:code 2 data segment 3 str db "assembly language, it's not difficult but tedious" 4 len equ $ - str 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 mov cx, len 12 mov si, 0 13 call strupr 14 15 mov ah, 4ch 16 int 21h 17 strupr: 18 s: mov al, byte ptr ds:[si] 19 cmp al, 'a' 20 jb print 21 cmp al, 'z' ;如果是字母才转大写,不是字母直接输出 22 ja print 23 24 mov ah, 2 25 and al, 11011111b ;转大写 26 mov dl, al 27 int 21h 28 inc si 29 loop s 30 31 ret 32 33 print: 34 mov ah, 2 35 mov dl, al 36 int 21h 37 inc si 38 loop s 39 40 code ends 41 end start
运行结果:
五、 实验任务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
程序运行测试截图:
程序的功能是?
从键盘输入一个字符,如果为7,在屏幕显示yes;如果不为7,在屏幕显示no.