实验2 汇编源程序编写与汇编、调试
一、实验目的
二、实验步骤
1、实验任务1
(1)使用文本编辑器,编写代码,具体如下:
;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
(2)使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并截图

可以很明显的发现在窗口的右上方出现的一些图像,推断应该是修改到了显示区域的内存。
(3)使用debug调试
- 使用d命令查看程序段前缀PSP所占的256个字节。在读入程序后,ds指向的段地址就是段前缀PSP,所以只需要使用命令“ d ds:0 100”即可。注意的是256个字节对应的是100H。(图1)
- 使用u命令对ex1.exe进行精确反汇编 。在读入程序后,cx寄存器中存储的就是代码的长度,所以只需要使用命令“u 2d”即可。(图2)
- 使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果。 (图3)

值得注意的是,在编写运行时,窗口会随着操作的增加而移动,也就是说。如果操作过程过长,原先修的数据会被刷新覆盖掉,。如图4,同样的指令,在操作过程后,再次查看内存,发现数据被覆盖,同时不再显示。
2、实验任务2
(1)使用文本编辑器,编写代码,具体如下:
; 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
(2)使用masm、link对ex2.asm进行汇编、链接,得到可执行文件ex2.exe,运行并截图

同样,发现在窗口的右上方出现的一些图像,应该也是修改到了显示区域的内存。
(3)使用debug调试
- 使用u命令对ex2.exe进行精确反汇编 。在读入程序后,cx寄存器中存储的就是代码的长度,所以只需要使用命令“u 1c”即可。(图1)
- 使用t命令,p命令,g命令分别执行程序。发现,t命令和p命令都是一次执行一行,当不同的是 t命令会对循环进行展开执行,而p命令不会。g命令是直接一次性执行多行。(图2 图3)

(4)把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。具体如下:

发现,输出的图像变多了,应该是因为循环次数增加导致的。
(5)ex1.asm和ex2.asm在功能上是一致的,都是将b810H后面的多个内存单元的数值进行了更改。不过在实现上不同,ex1.asm是对于每一个内存单元都编写了一条指令,而ex2.asm是通过循环来解决这次重复出现的指令的。
3、实验任务3
(1)使用文本编辑器,编写代码,具体如下:
; ex3.asm assume cs:code code segment mov ax, 0b800h mov ds, ax mov bx, 07b8H mov ax, 0237H mov cx, 10H s: mov [bx], ax add bx, 2 loop s mov ah, 4ch int 21h code ends end
(2)使用masm、link对ex3.asm进行汇编、链接,得到可执行文件ex3.exe,运行并截图,具体如图:

(3)把填充的字数据,从0237H 改成0239H,再次运行。 把填充的字数据,从0237H 改成0437H,再次运行。 具体如图:

根据实验的结果可以推断出,这个字数据中高位字节里存放的是图像的颜色信息,低位字节里存放的是具体的字符信息。
4、实验任务4
(1)使用文本编辑器,编写代码,具体如下:
; ex4.asm assume cs:code code segment mov ax, 0020H mov ds, ax mov bx, 0 mov cx, 0040H s: mov [bx], bl add bx, 1 loop s mov ah, 4ch int 21h code ends end
(2)使用masm、link对ex4.asm进行汇编、链接、运行,在使用d命令查看内存单元中的数据,具体如图:

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
(2)使用masm、link对ex5.asm进行汇编、链接、运行。使用u命令反汇编0020:0到0020:17中间的数据,具体如图:

可以的看出,反汇编出的指令就是ex5的代码,说明应该成功的将原代码复制到相应的内存单元内。
代码编写的依据:
1、因为需要复制自身代码,所以只需要把cs寄存器中的指传给ds即可,但因为不能直接传递,所以借用一下ax寄存器就可以了,因此第一空为 cs。
2、载入程序后,发现cx的值为1c,反汇编这段代码,发现具体指令只到17H(如下图),所以填写17H即可。

三、实验小结
在这次实验过程中,我对汇编程序的编译、连接、运行有了更加深刻的理解,同时对于[bx] 和 loop 的使用也更加得心应手,这也为我在后面的学习中打好了基础。


浙公网安备 33010602011771号