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

 

posted @ 2021-12-09 17:07  苏栋  阅读(74)  评论(2)    收藏  举报