实验1 用机器指令和汇编指令编程

目录


 

  • 实验结论
  • 实验总结

一、实验结论


 

1. 教材实验一

1)实验内容1:在debug中,将程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。

使用a命令将程序段写入内存

 使用t命令逐条执行指令

 2)实验内容2:将指令写入指定的内存单元,并利用写入的指令实现计算2的8次方。

使用a命令将指令写入指定内存(从2000:0000开始)

 使用r命令修改指定寄存器中内容(修改CS:IP的内容以设置下条指令的地址)

 使用r命令确认CS:IP寄存器设置成功后使用t命令执行指令

 执行t命令若干次直到AX中的内容变为2^8

3)实验任务3:查看内存中的记录的生产日期,并尝试改变它。

使用d命令直接获取从FFFF:0开始的128字节数据,找到DOSBox中设置的生产日期为1992年1月1日

使用e命令修改日期所在内存的内容,并用d命令进行验证修改

发现修改命令未生效,这是由于地址C000-FFFF的内存单元为只读存储器,而向只读存储器写入数据的操作是无效的

 4)实验任务4:向内存B810:0000H开始的单元中填写数据。

首先在命令行中执行cls保证屏幕清空,然后进入debug,输入指定内容,观察屏幕显示效果。

 修改数据内容

修改地址内容

向地址A000-BFFF的内存单元中写数据,就是向显存中写入数据,这些数据会被显卡输出到显示器上

不同的数据对应不同的显示内容,不同的内存单元对应不同的显示器位置

 

2.教材实验二

1)实验任务1:将指定程序写入内存后逐条执行,并填写相应内容。

在debug中将程序写入内存

执行前填空:

逐条执行代码

 执行结果检查

栈内存单元地址中的段内偏移地址计算错误 因注意地址的计算使用的是十六进制

即 0100H - 2 = 00FEH 而不是 0098H 其它错误地址 同理

2)实验任务2:按指定步骤执行程序,并分析内存中数据变化产生的原因

程序录入

单步执行

 分析:mov ax,2000和mov ss,ax意味着更改栈所在段地址为2000;mov sp,10意味着更改栈段内偏移地址为0010;三条指令的执行会将当前栈顶地址设置为2000:0010。

初始时的栈顶和栈底,初始时的栈顶地址是SS:SP 栈底地址是SS:SP+2。

不难看出 在栈顶地址的上方的内存单元 被作为了系统临时数据存储的场所(包括下一条指令的地址,访问寄存器的数据等等),在入栈出栈过程中,随着栈顶地址的变化,已经入栈的数据被存储在栈顶地址下方,临时数据存储在地址上方;这也是为什么在上述程序单步执行时,d命令查看到的数据,会随着入栈过程的进行,不断发生'偏移'。

二、实验总结


编程类的学习,重在实践。

在实践过程中必然会遇到一些问题,在发现问题之后如果能及时有效地描述问题,提出假设,设计验证方法,并借助工具(debug)进行实际验证,那么就会有很大的收获。

个人认为课本上的这两个实验除了是对理论知识的验证之外,还在向我们传达一个讯息:debug工具本身,也是基于我们所学的知识建立起来的,也即测试工具中每一个命令(d命令,e命令...)的执行本身,也是通过各个寄存器数据的变更来实现的。

posted on 2020-10-16 12:37  FreedYool  阅读(157)  评论(3编辑  收藏  举报