实验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.

 

posted @ 2021-12-13 19:31  无心12  阅读(103)  评论(2编辑  收藏  举报