汇编语言实验3 多个段的汇编源程序编写与调试

四、实验结论

1. 实验任务1

附上源代码文件task1.asm

 1 assume cs:code, ds:data
 2 data segment
 3         db 'Nuist'
 4         db 5 dup(2)
 5 data ends
 6 
 7 code segment
 8 start:
 9         mov ax, data
10         mov ds, ax
11 
12         mov ax, 0b800H
13         mov es, ax
14 
15         mov cx, 5
16         mov si, 0
17         mov di, 0f00h
18 s:      mov al, [si]
19         and al, 0dfh
20         mov es:[di], al
21         mov al, [5+si]
22         mov es:[di+1], al
23         inc si
24         add di, 2
25         loop s
26 
27         mov ah, 4ch
28         int 21h
29 code ends
30 end start

附上运行结果截图

可以看到在窗口左下角出现了绿色的字符串“NUIST”。

附上在debug里调试到程序返回前的截图

首先反汇编,查看指令地址

可以看出程序退出前的指令地址为27。使用g命令执行至程序退出前。

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。

db 5 dup(2)
--> 改成:
db 2,3,4,5,6

运行结果为

可以看出字符颜色改变。

分析源代码中data段line4的字节数据的用途

上一次实验的实验任务3中,我已经查阅了相关资料并得到了结论。这里再次对结论进行简要的陈述。

Line4中的5个字节数据为Line3中5个字符的显示属性(video attribute),用于控制对应的字符的显示效果。显示属性的8个比特位的含义如下图所示。

所以2(10B)代表前景颜色为绿色;3(11B)代表前景颜色为蓝绿色;4(100B)代表前景颜色为红色;5(101B)代表前景颜色为紫色;6(110B)代表前景颜色为黄色。与实际结果相符。

2. 实验任务2

附上源代码文件task2.asm

 1 ; task2.asm
 2 assume cs:code, ds:data
 3 data segment
 4     db 23, 50, 66, 71, 35
 5 data ends
 6 code segment
 7 start:  mov ax, data
 8     mov ds, ax
 9 
10     mov bl, 10
11     mov cx, 5
12     mov si, 0
13 s:      mov ax, 0
14     mov al, [si]
15     div bl
16     add al, 30h
17     mov dl, al
18     mov bh, ah
19     mov ah, 2
20     int 21h
21     mov al, bh
22     add al, 30h
23     mov dl, al
24     int 21h
25     inc si
26     loop s
27 
28     mov ah, 4ch
29     int 21h
30 code ends
31 end start

附上运行结果截图

3. 实验任务3

附上源代码文件task3.asm

 1 assume cs:code, ds:data, ss:stack
 2 data segment
 3   dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
 4 data ends
 5 
 6 stack segment
 7   dw 0, 0, 0, 0, 0, 0, 0, 0
 8 stack ends
 9 
10 code segment
11 start:  mov ax,stack
12         mov ss, ax
13         mov sp,16
14         
15         mov ax, data
16         mov ds, ax
17         
18         push ds:[0]
19         push ds:[2]
20         pop ds:[2]
21         pop ds:[0]
22         
23         mov ax,4c00h
24         int 21h
25 
26 code ends
27 end start

回答教材中①②③三个问题。

① data段中的数据没有改变,为0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h

② cs = 076ch, ss = 076bh, ds = 076ah

③ data段的段地址为X-2,stack段的段地址为X-1

附上回答①时,反汇编查看data段中数据的截图。验证观察到的结果和理论分析是否一致。

首先对程序反汇编,查看指令地址

运行至程序退出前,查看data段中的数据。

可以看出与理论结果相符合。

附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。

4. 实验任务4

附上源代码文件task4.asm

 1 assume cs:code, ds:data, ss:stack
 2 data segment
 3   dw 0123h, 0456h
 4 data ends
 5 
 6 stack segment
 7   dw 0, 0
 8 stack ends
 9 
10 code segment
11 start:  mov ax,stack
12         mov ss, ax
13         mov sp,16
14         
15         mov ax, data
16         mov ds, ax
17         
18         push ds:[0]
19         push ds:[2]
20         pop ds:[2]
21         pop ds:[0]
22         
23         mov ax,4c00h
24         int 21h
25 
26 code ends
27 end start

回答教材中①②③④四个问题。

① data段中数据不变,为0123h,0456h

cs = 076ch, ss = 076bh, ds = 076ah

③ data段的段地址为X-2,stack段的段地址为X-1

④ 该段实际占有的空间为(N/16+1)*16

附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。

5. 实验任务5

附上源代码文件task5.asm

 1 assume cs:code, ds:data, ss:stack
 2 
 3 code segment
 4 start:  mov ax,stack
 5         mov ss, ax
 6         mov sp,16
 7         
 8         mov ax, data
 9         mov ds, ax
10         
11         push ds:[0]
12         push ds:[2]
13         pop ds:[2]
14         pop ds:[0]
15         
16         mov ax,4c00h
17         int 21h
18 
19 code ends
20 data segment
21   dw 0123h, 0456h
22 data ends
23 
24 stack segment
25   dw 0,0
26 stack ends
27 end start

回答教材中①②③三个问题。

① data段中数据不变,为0123h, 0456h

cs = 076ah, ss = 076eh, ds = 076dh

③ data段的段地址为X+3,stack段的段地址为X+4

附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。

6. 实验任务6

回答教材中提出的问题,并按要求说明原因。

若将“end start”改为“end”,则只有task 5可以正确执行。因为修改之后,不指明程序入口,则程序从头开始执行。但是task 3与4开头均为数据段与栈段,这里的数据会被当作机器指令执行,所以无法得到预期的结果;而task 5开头即为代码段,所以从头执行能够得到正确的结果,同时在代码段结束时调用系统中断退出程序,从而能够得到预期的结果。

7. 实验任务7

附上完整源代码文件task7.asm

 1 assume cs:code
 2 a segment
 3     db 1,2,3,4,5,6,7,8
 4 a ends
 5 
 6 b segment
 7     db 1,2,3,4,5,6,7,8
 8 b ends
 9 
10 c1 segment   ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
11     db 8 dup(0)
12 c1 ends
13 
14 code segment
15 start:
16     mov ax, a
17     mov ds, ax
18 
19     mov cx, 8
20     mov bx, 0
21 s:    mov al, [bx]
22     add al, [bx+10h]
23     mov [bx+20h], al
24     inc bx
25     loop s
26 
27     mov ah, 4ch
28     int 21h
29 code ends
30 end start

附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正确实现了题目要求。

首先查看相加之前c段中的数据(d 20 2f),可以看出均为0。

反汇编以查看指令地址,并执行至程序退出前,再次查看内存(d 20 2f)。

可以看出程序正确执行。

8. 实验任务8

附上完整源代码文件task8.asm

 1 assume cs:code
 2 
 3 ; ds:0
 4 a segment
 5     dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
 6 a ends
 7 
 8 ; ds:20h
 9 b segment
10     dw 8 dup(0)
11 b ends
12 
13 ; ds:30h
14 code segment
15 start: 
16     mov ax, a
17     mov ds, ax
18 
19     add ax, 2
20     mov ss, ax
21     mov sp, 10h
22 
23     mov cx, 8
24     mov bx, 0
25 s:    push [bx]
26     add bx, 2
27     loop s
28 
29     mov ah, 4ch
30     int 21h
31 code ends
32 end start

附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正确实现了题目要求。

首先查看栈操作之前b段中的数据(d 20 2f),可以看出均为0。

反汇编以查看指令地址,并执行至程序退出前,再次查看内存(d 20 2f)。

可以看出程序正确执行。

posted @ 2020-11-21 17:23  xywei0905  阅读(199)  评论(2)    收藏  举报