一、实验内容
1. 实验任务1
(1)使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex1.asm进行汇编、链接、运行
- 使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。源代码如下:
;ex1.asm assume cs:code code segment mov ax, 0b810h mov ds, ax mov byte ptr ds:[0], 1 mov byte ptr ds:[1], 1 mov byte ptr ds:[2], 2 mov byte ptr ds:[3], 2 mov byte ptr ds:[4], 3 mov byte ptr ds:[5], 3 mov byte ptr ds:[6], 4 mov byte ptr ds:[7], 4 mov ah, 4ch int 21h code ends end
- 使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。
- 此时可以看到经过masm、link对ex1.asm进行汇编、链接得到ex1.obj,ex1.exe文件:
(2)使用debug工具对程序进行调试
- 使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节。
- 结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编
- 使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果。
- 这里可以看出数据改变了但是却没有改变成现象中的0 01 02..的形式,这里通过查看资料得知:
- 那是因为dosbox那个彩色线框的影响,它会在我们写入显存后重绘一遍彩色线框
- 对此我们需要在debug ex1.exe时先进行清屏cls操作,在进行接下来的步骤
2. 实验任务2
(1)使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行
- 使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。源代码如下:
; ex2.asm assume cs:code code segment mov ax, 0b810h mov ds, ax mov bx, 0 mov ax, 101H mov cx, 4 s: mov [bx], ax add bx, 2 add ax, 101H loop s mov ah, 4ch int 21h code ends end
- 使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果。
(2)使用debug工具对程序进行调试。
- 结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编
- 灵活使用t命令、p命令、g命令,对ex2.exe进行调试。
- (不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)
- 注意:单步调试时,对于循环指令loop, 中断指令int,使用t命令和p命令单步调试的区别。
- t命令调试指令loop,中断指令int,结果如下:
- p命令调试指令loop和中断指令int,结果如下:
- 结论:
T命令:单步执行,每次只执行一条代码语句,遇到子程序后进入子程序逐条执行指令;
P命令:类似T命令,若有子程序,直接执行完子程序全部指令而不是逐条执行指令,在遇到循环指令时,会直接执行至CX递减至0;
G命令:多步执行,可以跟地址和断点,即格式为 G[=address] [breakpoints],运行到[breakpoints]指定位置的指令后暂停,若不加参数则从当前IP运行到程序结束。
(3)把ex2.asm中 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。
- 结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在
- 具体实现上有什么不同?
ex1.exe结果如下:
改前ex2.exe结果如下:
改后ex2.exe结果如下:
- 结论:
1、对比ex2.asm和ex1.asm,它们实现的是相同的功能和效果,只是实验二通过loop指令循环来实现,
实验一则是一步一步赋值得到,所以相较于实验一,实验二的效率更高。
3. 实验任务3
(1)综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据
0237H。
- 编写汇编源程序:
;ex3.asm assume cs:code code segment mov ax,0b800h mov ds,ax mov bx,07b8h mov ax ,0237h mov cx,16 s: mov [bx],ax add bx,2 loop s mov ah,4ch int 21h code ends end
- 使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex3.exe
- 运行ex3.exe,结果如下:
(2)把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
(3)把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
- 猜测与分析:
从实验结果来看改变这个填充的字数据,从0237与0239的结果来看,结果没有改变颜色而是改变了图案,
而从0237与0437的结果来看,结果没有改变图案而是改变了颜色,所以可以猜想这个字数据高字节确定颜色,
低字节则确定图案,同时查看ascii表可以得出图案是与ascii的值对应,如下图:
4. 实验任务4
(1)编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
- 编写汇编源程序:
;ex4.asm assume cs:code code segment mov ax,0020h mov ds,ax mov bx,0h mov ax,0h mov cx,64 s: mov [bx],ax add bx,1h add ax,1h loop s mov ah,4ch int 21h code ends end
- 使用masm、link对ex4.asm进行汇编、链接,得到可执行文件ex4.exe
- 使用debug工具对程序进行调试。
- 结合可执行文件中寄存器CX的值,使用u命令对ex4.exe进行精确反汇编
-
灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看
0:200~0:23F,确认是否将0~3F传送至此段内存区域。
- 结论:从实验截图可知数据被写入到相应位置里了
(2选做)利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过指令实现),编
写源程序
- 编写汇编源程序:
;ex41.asm assume cs:code code segment mov ax,0020h mov ss,ax mov sp,0040h mov ax,3f00h mov cx,64 s: push ax inc sp dec ah loop s mov ax,4c00h int 21h code ends end
- 灵活使用debug的t命令、g命令、p命令调试。用d命令查看
0:200~0:23F,确认是否将0~3F传送至此段内存区域。
5. 实验任务5
(1)补全代码,并且调试运行回答问题。
;ex5.asm assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,17h s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
填空依据:
第一空:程序要求把代码“mov ax,4c00h”之前的指令复制到内存,所以要使段地址指向代码开始的地方
也就是cs指向的地址。
第二空:复制的指令是到代码“mov ax,4c00h”之前的指令,通过指令u可以看出指令是从0~17h结束,
所以填写17h
- 使用masm、link对ex4.asm进行汇编、链接,得到可执行文件ex4.exe
- 使用debug工具对程序进行调试。
二、实验总结
-
在dosbox的虚拟DOS环境下使用masm和link工具对.asm的汇编源码文件进行汇编、链接生成EXE可执行文件的具体操作步骤。
-
t命令,p命令,g命令的使用,及了解它们之间的区别:
-
T命令:单步执行,每次只执行一条代码语句,遇到子程序后进入子程序逐条执行指令;
-
P命令:类似T命令,若有子程序,直接执行完子程序全部指令而不是逐条执行指令,在遇到循环指令时,会直接执行至CX递减至0;
-
G命令:多步执行,可以跟地址和断点,即格式为 G[=address] [breakpoints],运行到[breakpoints]指定位置的指令后暂停,若不加参数则从当前IP运行到程序结束。
-
段寄存器DS, SS, ES, CS的了解与使用
-
循环指令loop的使用:指令的功能是 dec cx(计数寄存器),循环指令执行为cx减为0时停止。这里要注意的是在debug中cx默认存放的是mov ah,4c00h之前指令总的字节数。所以使用它当循环计数前要记得重新赋值。
- 在dosbox的虚拟DOS环境下在实验过程中向显存区改变数据不成功问题:对此是因为那可能是因为dosbox页面轮转了一次,使之前改变的内存数据又被覆盖了,解决方法cls清屏一下,只要保证页面一直在当前页面就行。对比下面两张图可以看出,在开始页面可以看到改变的内存数据与图案,而当指令过多,页面移动后图案消失,同时数据被覆盖。