实验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做,可是一直报错,不知道为什么,所以就换了一种方法

上完课我发现我忽略了一点,mov  [bx],0433h这条指令的正确写法应该是mov  word  ptr  [bx],0433h

所以原有的程序在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)对于不熟悉的东西最好的办法就是多联系,熟能生巧

转载于:https://www.cnblogs.com/yinghuapiaoluo/p/9868066.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值