汇编语言实验 3 编程、编译、连接、跟踪
实验内容
(1)第1步,编写汇编源程序t1.asm, 源程序代码如下:
assume cs:code
code segment
mov ah,2
mov dl,3
add dl,30h
int 21h
mov ah,2
mov dl,6
add dl,30h
int 21h
mov ah,4ch
int 21h
code ends
end
因为对汇编语言的一系列还不熟练,所以花了点时间,终于进去了。
对源程序 t1.asm 进行汇编、连接、运行、调试
(1) 运行程序,观察程序输出结果是什么?
输出结果为36
(2) 将 line4和line9种寄存器dl 的值分别修改为 0~9 中任何一个数字,重新汇编→ 连接→运行,观察结果的变化。
我将line4中的值改为1,line9中的值改为4,
(3) 用debug对生成的可执行文件 t1.exe 进行调试。
① 使用 r 命令查看。观察寄存器 cx 的值是 多少;观察寄存器 ds 和 cs 的值是多 少,它们之间是否满足关系(cs)=(ds)+10H?
cx为0016H,cs为076A,ds为075A,符合关系(cs)=(ds)+10H。
② PSP(程序段前缀)的头两个字节是CD 20, 用debug查看PSP的内容,验证是否 如此。
的确如此
③ 使用 u 命令对 t1.exe 进行反汇编,观察反汇编得到的源代码。
反汇编得到的如图所示
④ 使用 t 命令和 p 命令(遇到 int 命令时,用 p 命令)单步调试,观察结果。
出现了3
出现了6
组成了最后t1.exe的36。
(2)第1步,编写汇编源程序t2.asm,源程序代码如下
assume cs:code
code segment
mov ax,0b800h
mov ds,ax
mov bx,0
mov [bx],0433h
add bx,2
mov [bx],0436h
mov ax,4c00h
int 21h
code ends
end
第2步,对源程序 t2.asm 进行汇编、连接、运行、调试
(1) 对t2.asm进行汇编、连接后,得到可执行文件t2.exe。运行t2.exe,观察程序运行 结果,验证是否在屏幕左上方出现红色的数值36
经过cls之后,重新输入t2,出现了目标结果
(2) 如果(1)结果得到验证,重新打开t2.asm,尝试将源代码中line7的0433h→0432h, line10 的 0436h→0439h, 然后重新汇编、连接,得到可执行文件 t2.exe。使用 cls 命令清 屏后,再次观察程序运行结果。
修改成功
出现了红色的29
(3) 如果(1)结果得到验证,重新打开t2.asm,尝试将源代码中line7的0433h→0333h, line10 的 0436h→0336h, 然后重新汇编、连接,得到可执行文件 t2.exe。使用 cls 命令清 屏后,再次观察程序运行结果。
修改成功
出现了蓝色的36
这个发现和之前的实验一最后一部分类似。
实验一向内存从B8100H开始的单元中填写数据,每一次填写的数据不一样会出现不同的表情符号,而这次编写代码0433h举例来说,mov这个操作,043三个字节决定了颜色的不同,最后一个字节决定了输出的内容。而【】符号似乎就是颜色的填充工具。
分析这次两个练习输出的不同
mov ax,0b800h mov ah,2
mov ds,ax mov dl,3
mov bx,0 add dl,30h
mov [bx],0433h mov ah,2
add bx,2 mov dl,6
mov [bx],0436h add dl,30h
第一次有一项add dl,30h即将数字转换为相对应的ASCII码打印出来,这个实验通过8位寄存器实现,而第二次是通过16位寄存器,直接输出。
实验总结
通过这次实验,我知道了一个完整汇编程序的输入输出的流程,学会了对于数字颜色的把控,以及两种输出的格式。