实验一

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

 

posted @ 2021-10-20 21:34  随影ys  阅读(111)  评论(4)    收藏  举报