汇编语言实验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)。

可以看出程序正确执行。
浙公网安备 33010602011771号