实验4

实验任务1

 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

 在debug中调试,观察数据段中做128位加之前和加之后,数据段的值的变化。给出调试观察截图。

做128位加之前的数据段的值截图:

 做128位加之后的数据段的值截图:

line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?

1 add si, 2
2 add di, 2

答:,因为 add命令虽然会影响标志寄存器的值,但本题中的数据并没有在每次循环中进位,进位标志位一直为0,而add si, 2和add di, 2也正好不会产生进位影响进位标志位的值,因此不影响adc命令时的结果。

 

 下为将inc指令改为add命令后 做128位加之后的数据段的值截图:

可见与inc指令的结果一致。 

实验任务2

 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,实现的功能是?

答:读取当前屏幕上输入的字符并将该字符的ascii码存入al,将al内容写入data段中,再去判断al是否为‘#’,如果是IP就跳到next段,如果不是则si指向下一个内存单元,IP调到s1开始

② 汇编指令代码line20-22,实现的功能是?

答:0AH是换行符的ASCII码,这三行的功能就是在屏幕上输出换行符。

 

③ 汇编指令代码line24-30,实现的功能是? 

偏移地址从0到si的大小(si的大小即为存入内存单元的字符个数 注意!不包括'#') ,将每一个内存单元的内容输出到屏幕上。

实验任务3

 1 assume cs:code, ds:data
 2 
 3 
 4 data segment
 5     x dw 91, 792, 8536, 65521, 2021
 6     len equ $ - x
 7 data ends
 8 
 9 code segment 
10 start:
11     mov ax, data
12     mov ds, ax
13 
14     mov si, offset x ; 取符号x对应的偏移地址0 -> si
15 
16     mov cx, len
17     mov bx, 10
18 
19 s1:
20     mov al, [si]
21     inc si    
22     mov ah, [si]
23     inc si
24     dec cx
25     call printNumber
26     call printSpace
27     loop s1
28 
29     mov ah, 4ch
30     int 21h
31 
32 printNumber: 
33     push cx
34     mov cx, 0
35 s2:    
36     sub ax, 0
37     jz s3
38     mov dx, 0
39     div bx
40     push dx
41     inc cx
42     jmp s2
43    
44 s3:   
45     pop dx
46     or dl, 30H;将数字转换为字符
47     mov ah, 2
48     int 21h
49     loop s3
50 
51     pop cx
52     ret
53 
54  printSpace: ;输出空格
55     mov ah, 2
56     mov dl, ' '
57     int 21h  
58     ret 
59 
60 code ends
61 end start

运行测试截图

 

 实验任务4

 1 assume cs:code, ds:data
 2 
 3 data segment
 4     str db "assembly language, it's not difficult but tedious"
 5     len equ $ - str
 6 data ends
 7 
 8 code segment 
 9 start:
10     mov ax, data
11     mov ds, ax
12 
13     mov si, offset str
14     mov cx, len 
15     call strupr
16 
17     mov ah, 4ch
18     int 21h    
19 strupr: 
20 s1:
21     mov al, [si]
22     cmp al, 97
23     jb s2   
24     cmp al, 122
25     ja s2
26     and al, 0dfH
27     mov [si], al
28     
29 s2:    
30     inc si
31     loop s1
32     ret 
33     
34 code ends
35 end start

call strupr 调用之前,数据段的值

 call strupr 调用之后,数据段的值

实验任务5 

 1 assume cs:code, ds:data
 2 
 3 data segment
 4     str1 db "yes", '$'
 5     str2 db "no", '$'
 6 data ends
 7 
 8 code segment
 9 start:
10     mov ax, data
11     mov ds, ax
12 
13     mov ah, 1
14     int 21h
15 
16     mov ah, 2
17     mov bh, 0
18     mov dh, 24
19     mov dl, 70
20     int 10h
21 
22     cmp al, '7'
23     je s1
24     mov ah, 9
25     mov dx, offset str2
26     int 21h
27 
28     jmp over
29 
30 s1: mov ah, 9
31     mov dx, offset str1
32     int 21h
33 over:  
34     mov ah, 4ch
35     int 21h
36 code ends
37 end start

程序运行测试截图(输入7,以及输入其他字符,运行结果截图)

 程序的功能是?

答:读取从键盘输入单个字符,然后设置光标位置在第0页,第24行 第70列,如果是7则在此处输出yes否则在此处输出no

实验任务6

两个程序正确编写、汇编、链接,运行后,得到结果如下:

 

posted @ 2021-12-12 16:42  monistery  阅读(52)  评论(3)    收藏  举报