实验一
实验2
1)d命令查看的对应内存存储内容的截图

2)使用e命令修改对应内存空间以及再次使用d命令查看内存空间情况的截图

结论:该段内存不可以被修改。原因如下:地址段 C0000至地址FFFFF地址段为各类ROM地址空间,对其进行写入操作是无效的,因为ROM为只读存储器。
实验3
1)e命令修改内存空间的截图

2)f命令批量填充内存单元的截图

使用f指令的另外格式进行修改

结论:从A0000地址到BFFFF地址为显存地址,修改该段地址内的内存单元将会使系统显示相应的图形。
实验4
1)
逻辑地址:逻辑地址的形式为 段地址:段内偏移地址,所以栈顶逻辑地址为:0020:0030
物理地址:物理地址为唯一地址,具体计算为段地址左移一位加上段内偏移地址:00230
2)d命令查看压入数据后栈空间数据

3)d命令查看弹出数据后栈空间数据

4)d命令查看修改弹出位置后栈空间数据

结论:push[]和pop[]操作的操作单位都是字,在push[]时是对栈地址的高地址进行写入操作,栈顶指针依次减2,pop[]时反之。同时,在写入操作与读出操作时,都应注意对应低地址的内容写在栈中相应低地址区域,高地址内容写在高地址区域,在读出时同样如是。
实验5
1)

不是单步执行就结束的,后面的对栈顶指针的操作在对堆栈段寄存器操作的同时也进行完了(或者是晚于对堆栈寄存器操作,但不作为另一单独操作)。
2)

在堆栈分配空间时似乎会多分配5个存储空间(根据某篇博文所述)或者说在栈空间的栈顶空间处(根据实验得知)连续压入5个寄存器数据,进行的5个操作分别是PUSHF、PUSH CS、PUSH IP、PUSH BP、PUSH AX,前三个指令的目的大概是调用中断的压栈操作,但对于后面两个的目的仍不清楚,但总体而言,这5个压栈操作的目的大致上应该都是程序调用。
实验六
1)程序代码截图

2)编译、连接以及执行截图



3)段前缀psp截图


实验七
1)补全的代码截图

依据如下:首先需要定位到具体的代码段,所以要讲cs寄存器中的数据赋值到ax中,然后,关于cs寄存器的值,可以通过调用debug中的u命令查看指令所占的字节数来确定。
2)0:200开始的汇编指令截图


实验总结
debug工具可以应用于多种场景,解决不同的问题;在程序的装入环节,还存在着很多所不熟知的系统自动进行的操作;对于程序段的长度需根据不同指令的类型进行判断并累加得到。

浙公网安备 33010602011771号