1. 实验任务1
使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。
1 assume cs:code 2 code segment 3 mov ax, 0b810h 4 mov ds, ax 5 mov byte ptr ds:[0], 1 6 mov byte ptr ds:[1], 1 7 mov byte ptr ds:[2], 2 8 mov byte ptr ds:[3], 2 9 mov byte ptr ds:[4], 3 10 mov byte ptr ds:[5], 3 11 mov byte ptr ds:[6], 4 12 mov byte ptr ds:[7], 4 13 mov ah, 4ch 14 int 21h 15 code ends
使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。


使用debug工具对程序进行调试使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节。

结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果。



2. 实验任务2
使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。
1 assume cs:code 2 code segment 3 mov ax, 0b810h 4 mov ds, ax 5 mov bx, 0 6 mov ax, 101H 7 mov cx, 4 8 s: mov [bx], ax 9 add bx, 2 10 add ax, 101H 11 loop s 12 mov ah, 4ch 13 int 21h 14 code ends 15 end
- 使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并观察结果。


- 使用debug工具对程序进行调试。结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编灵活使用t命令、p命令、g命令,对ex2.exe进行调试。


把ex2.asm中line9mov cx, 4改成mov cx, 8,保存后重新汇编、链接、运行并观察结果。


在debug模式下,由于单步调试上滚所以显存刷新没有被显示出来。退出之后执行程序。

改变的cx寄存器改变了循环的次数,第一次循环4次,改变后循环八次。增加了写进显存的数据
- 结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?
两个实验实现的是相同的功能和效果。但在具体是实现上实验一是直接写入,而实验二使用了loop循环的方式,简化了重复代码。
3. 实验任务3
- 综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0237H
1 assume cs:code 2 code segment 3 mov ax,0b800h 4 mov ds,ax 5 mov bx,07b8h 6 mov cx, 10h 7 s: mov [bx],0237h 8 add bx,2 9 loop s 10 mov ah,4ch 11 int 21h 12 code ends 13 end
在汇编,链接之后,运行:

- 把填充的字数据,从0237H改成0239H,再次保存后,汇编、链接、运行,观察结果。

- 把填充的字数据,从0237H改成0437H,再次保存后,汇编、链接、运行,观察结果。

- 猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
猜测低位字节存放的的是显示的文字内容,高位字节存放的是字体格式颜色等附加的信息。
4. 实验任务4
- 编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
- 综合使用[bx]和loop,编写汇编源程序
- 灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域
1 assume cs:code 2 code segment 3 mov ax,0h 4 mov ds,ax 5 mov bx,200h 6 mov cx,40h 7 s: mov ds:[bx],bl 8 inc bx 9 loop s 10 mov ah,4ch 11 int 21h 12 code ends 13 end
进行汇编,链接

使用debug命令之后反汇编

使用g命令调试,使用d命令查看0:200~23F是否准确传送数据:

- 选做*
- 利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过指令实现),编写源程序
- 灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看0:200~0:23F,确认是否将0~3F传送至此段内存区域
1 assume cs:code 2 code segment 3 mov ax,20h 4 mov ss,ax 5 mov sp,40h 6 mov bh,3fh 7 mov bl,3eh 8 mov cx,20h 9 s:push bx 10 sub bh,2 11 sub bl,2 12 loop s 13 mov ah,4ch 14 int 21h 15 code ends 16 end
编写程序结束,进行汇编链接调试


查看内存写入数据是否正确:

- 由于8086的栈按字读入,一次入栈两个数据,所以我把两个数据分别存在寄存器中的高位和低位。
- 由于入栈操作时从高地址到低地址,所以数字从大到小存储。
5. 实验任务5
教材实验4(3)(P121)
将mov ax,4c00h之前的指令复制到内存0:200处,补全程序。
1 assume cs:code 2 code segment 3 mov ax,cs 4 mov ds,ax 5 mov ax,20h 6 mov es,ax 7 mov bx,0 8 mov cx,17 9 s: mov al,[bx] 10 mov es:[bx],al 11 inc bx 12 loop s 13 mov ax,4c00h 14 int 21h 15 code ends 16 end

根据mov ah,4ch之前的偏移量是17, 说面前面的指令长度是17-0=17,可知代码中应该填17。复制的循环次数17。

和上图对比,发现对于内存中存储的数据反汇编后得到和代码反汇编的结果一样,证明复制成功!
五、实验总结
本次实验了解并且可以熟练操作对于程序的编译连接调试,可以灵活的运用debug调试功能。单步调试t命令是详细的,单步调试p命令是不进入子程序,g命令可以多步调试。在程序中,如果代码有大段重复的可以考虑使用loop循环来简化代码,cx寄存器中存储的是循环的次数,每循环一次,cx减一。
浙公网安备 33010602011771号