实验3 编程编译连接跟踪
Posted yinghuapiaoluo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验3 编程编译连接跟踪相关的知识,希望对你有一定的参考价值。
一、实验任务
1、练习1
Part1:编写汇编源程序:
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
ps:我比较熟悉masm,所以用了这个编译器
打的时候不小心把ends打成了end,结果报错了,改过来才编译成功
Part2:对源程序t1.asm进行汇编、连接、运行、调试
(1)运行程序,观察程序输出的结果
(2)将line4和line9中寄存器dl的值分别修改为0~9中任何一个数字,重新汇编->连接->运行,观察结果的变化
(3)用debug对生成的可执行文件t1.exe进行调试
a.使用r命令查看。观察寄存器cx的值是多少;观察寄存器ds和cs的值是多少,它们之间是否满足关系(cs)=(ds)+10h?
b.PSP(程序段前缀)的头两个字节是CD 20,用debug查看PSP的内容,验证是否如此
c.使用u命令对t1.exe进行反汇编,观察反汇编得到的源代码
d.使用t命令和p命令(遇到int命令时,用p命令)单步调试,观察结果
——————————————————————————————————————————————
在dosbox底下进行编译、连接
这部分内容我不熟悉,还打错了好几次
第一次输的时候还把“;”给忘了
这是我用masm直接运行得到的结果
——————————————————————————————————————————————
这是改变数字之后得到的结果,可以看到,改变了寄存器dl中的值得到的结果也有区别
这次我在汇编连接完之后直接运行了一下,和masm下运行的结果是一致的
——————————————————————————————————————————————
寄存器cx的值是0016
寄存器ds的值是075A
寄存器cs的值是076A
满足关系(cs)=(ds)+10h
这里我用t命令和p命令单步调试,第一次p命令过后显示了3,第二次p命令过后显示了6,这应该就是结果36的由来
——————————————————————————————————————————————
显然是符合题目的
ps:一开始看到实验的时候不知道PSP是什么,去看了一下书,而且百度了一下
程序加在后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为0,则程序所在的内存区的地址为ds:0
这个内存区的前256个字节中存放的是PSP,DOS用来和程序进行通信。从256字节处向后的空间存放的是程序
所以,从ds中可以得到PSP的段地址SA,PSP的偏移地址为0,则物理地址为SA×16+0
其中,SA为系统为程序分配内存的起始位置的段地址,即当前寄存器DS的内容
——————————————————————————————————————————————
用u命令反汇编得到的结果
2、练习2
Part1:编写汇编源程序t2.asm
assume cs:code
code segment
mov ax,0b008h
mov ds,ax
mov bx,0
mov [bx],0433h
add bx,2
mov [bx],0436h
mov ax,4c00h
int 21h
code ends
end
ps:我原本打算这个也直接用masm做,可是一直报错,不知道为什么,所以就换了一种方法
这个方法我不熟悉,做了好久才做出来,一直有打错的
Part2:对源程序进行汇编、连接、运行、调试
(1)对t2.asm进行汇编、连接后,得到可执行文件t2.exe。运行t2.exe,观察程序运行结果,验证是否在屏幕左上方出现红色的数值36
(2)如果(1)结果得到验证,重新打开t2.asm,尝试将源代码中line7的0433h->0432h,line10的0436h->0439h,然后重新汇编、连接,得到可执行未见t2.exe
使用cls命令清屏后,再次观察程序运行结果
(3)如果(1)结果得到验证,重新打开t2.asm,尝试将源代码中line7的0433h->0333h,line10的0436h->0336h,然后重新汇编、连接,得到可执行未见t2.exe
使用cls命令清屏后,再次观察程序运行结果
——————————————————————————————————————————————
——————————————————————————————————————————————
——————————————————————————————————————————————
ps:这个颜色倒是让我想起了实验一当中的最后一个任务,改变赋值,会改变颜色,这里还改变了数值
总结:
(1)打代码的时候要注意细节,比如有没有h,end有没有s这种
(2)masm t1.asm后面要加“;”
(3)寄存器ds和cs满足(cs)=(ds)+10h
(4)给寄存器中的8位寄存器赋值和16位寄存器赋值会得到不同的结果
(5)关于masm为什么会报错,我不是很清楚,询问了别人说是编译器的问题
(6)练习2的代码实现了运行结果数字颜色的变化
(7)做这个实验,我体会到了课后自己再看书看PPT的重要性,一上来直接做这个实验发现都无从下手
(8)对于不熟悉的东西最好的办法就是多联系,熟能生巧
以上是关于实验3 编程编译连接跟踪的主要内容,如果未能解决你的问题,请参考以下文章