实验三
实验内容
1.练习1
第1步,编写汇编源程序t1.asm,源程序代码如图1-1所示。
1 |
assume cs:code |
2 |
code segment |
3 |
mov ah, 2 |
4 |
mov dl, 3 |
5 |
add dl, 30h |
6 |
int 21h |
7 |
|
8 |
mov ah, 2 |
9 |
mov dl, 6 |
10 |
add dl, 30h |
11 |
int 21h |
12 |
|
13 |
mov ah, 4ch |
14 |
int 21h |
15 |
code ends |
16 |
end |
图1-1汇编源程序tl .asm源代码
第2步,对源程序tl.asm进行汇编、连接、运行、调试
(1) 运行程序,观察程序输出结果是什么?
首先,编译
刚开始时,我的t1.asm文件和masm不在同一文件下并且没有输入完整路径,出现了以下错误,如图:
经过修正,将t1.asm放入masm的同一目录下,编译得到如下结果,如图:
由上图可知,这个源程序没有警告错误和必须要改正的错误;
然后,连接
这个程序有一个警告错误“没有栈段”,这里我们不理会这个错误;
最后,运行
这里可以看出,运行结果为36;
(2) 将line4和line9种寄存器dl的值分别修改为0~9中任何一个数宇,重新汇编— 连接—运行,观察结果的变化。
这里,我将line4的3改为5,将line9的6改为7,以简化的方式重新进行编译、连接、运行,得到如下图:
结果由原来的36变为57;
⑶用debug对生成的可执行文件t1.exe进行调试。
① 使用r命令查看。观察寄存器cx的值是多少;观察寄存器ds和cs的值是多 少,它们之间是否满足关系(cs) = (ds) + 10H?
cx=0016h;cs=076Ah,ds=075Ah,满足cs=ds+10h;
② PSP (程序段前缀)的头两个字节是CD 20,用debug查看PSP的内容,验证是否 如此。
③ 使用u命令对t1.exe进行反汇编,观察反汇编得到的源代码。
④ 使用t命令和p命令(遇到int命令时,用p命令)单步调试,观察结果。
2.练习2
第1步,编写汇编源程序t2.asm,源程序代码如图1-2所示。
1 |
assume cs:code |
2 |
code segment |
3 |
mov ax, 0b800h |
4 |
mov ds, ax |
5 |
|
6 |
mov bx, 0 |
7 |
mov [bx], 0433h |
8 |
|
9 |
add bx, 2 |
10 |
mov [bx], 0436h |
11 |
|
12 |
mov ax, 4c00h |
13 |
int 21h |
14 |
code ends |
15 |
end |
图1-2汇编源程序t2.asm源代码
注*:
line6-7相当于 mov [0], 0433h line9-10相当于 mov [2], 0436h
至于为什么这样使用两条指令,而不直接简化写成上面的形式,有两个原因。其中_个 是方便以后循环;另一个原因,留待第5章再解释说明。暂时,先这样使用。
第2步,对源程序t2.asm进行汇编、连接、运行、调试
(1) 对t2.asm进行汇编、连接后,得到可执行文件t2.exe。运行t2.exe,观察程序运行 结果,验证是否在屏幕左上方出现红色的数值36。
清屏后,得到如下图:
注*)经测试,有些平台在dosbox下运行这个程序时有些问题,如果屏幕左上方没有 输出结果,请运行程序t2.exe前,先输入cls命令清空一下屏幕,然后再执行t2.exe。
(2) 如果(1)结果得到验证,重新打开t2.asm,尝试将源代码中line7的0433h—0432h, linelO的0436h—0439h,然后重新汇编、连接,得到可执行文件t2.exe。使用cls命令清 屏后,再次观察程序运行结果。
代码如下:
运行结果:
(3) 如果(1)结果得到验证,重新打开t2.asm,尝试将源代码中line7的0433h—0333h, line10的0436h—0336h,然后重新汇编、连接,得到可执行文件t2.exe。使用cls命令清 屏后,再次观察程序运行结果。
代码如下:
运行结果:
总结与体会
这次的实验让我进一步的了解汇编源程序如何编写、汇编、连接、运行、调试,也顺利地解决了实验中出现的一些小问题,很期待接下来的学习。