实验1 8086汇编指令编码和调试

1. 实验任务1

自行练习,掌握工具用法。此部分无需写实验结论。

如练习中遇到、发现问题,使用搜索引擎,以及,和同学讨论后,都暂时未能得到解决或释疑,可以写

入这一部分。共大家一起讨论。

2. 实验任务2

 

结论:不能修改。

原因分析:此处地址为ROM存储器中的单元,向其写入数据没有结果,并不会改变该单元中的内容。

3.实验任务3

debug中使用e命令修改内存单元

-e b800:0 03 04 03 04 03 04 03 04 03 04

结果如图所示:

 

debug中使用f命令批量填充内存单元

-f b800:0f00 0f9f 03 04

结果如图所示:

 

尝试修改数据后的效果如图所示:

 

4. 实验任务4

根据在debug环境中调试观察结果,填空并回答问题。

填空

*: 以下这段汇编指令代码,是在debug环境中使用a命令输入的汇编指令。debug环境中,默认

十六进制。

-a

mov ax, 20

mov ds, ax

mov ss, ax

mov sp, 30

push [0] ; 执行后,寄存器(sp) = __2E__

push [2] ; 执行后,寄存器(sp) = __2C__

push [4] ; 执行后,寄存器(sp) = __2A__

push [6] ; 执行后,寄存器(sp) = __28__

pop [6] ; 执行后,寄存器(sp) = __2A__

pop [4] ; 执行后,寄存器(sp) = __2C__

pop [2] ; 执行后,寄存器(sp) = __2E__

pop [0] ; 执行后,寄存器(sp) = __30__  

回答问题

问题1:题目要求是把00220H ~ 0022fH用作栈空间。指令 mov ss, ax mov sp, 30 执行后,

栈顶的逻辑地址和物理地址分别是?

答:逻辑地址:0020H:0030H。物理地址:00230H

问题2:单步调试到汇编指令 push [6] 执行结束, pop [6] 执行之前,使用 d 20:20 2f 查看此

时栈空间数据,给出实验截图。

 

问题3:汇编指令 pop [0] 执行结束后, pop [0] 指令执行结束后,使用d命令 d 20:0 7 查看此

时数据空间内的数据是否有变化。给出实验截图。

 

问题4:如果把最后四条指令改成截图中的顺序, pop [6] 指令执行结束后,使用d命令 d 20:0 7

查看此时数据空间内的数据是否有变化。给出实验截图。

 

5. 实验任务5

回答问题1和问题2。

问题1:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov

sp, 30 是什么时候执行的?

答:没有暂停,而是接着执行了mov sp,30,如图所示

 

sp中内容已变为0030H。查阅资料可知,debug的t命令在执行修改寄存器SS的指令时,下一条指令也紧跟着被执行.

问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通 过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。

 

推测修改SP的值时,存在着某种机制使用了栈,从而给栈中留下了一些数据。

6. 实验任务6

给出程序源码

assume cs:code

code segment

start:

mov cx,10

mov dl,'0'

s: mov ah,2

int 21h

add dl,1

loop s

 

mov ah,4ch

int 21h

code ends

end start

给出使用masm、link对程序汇编链接过程截图,以及,运行可执行程序task5.exe的运行结果截图

 

给出在debug中查看task5.exe的程序段前缀PSP的截图。

7. 实验任务7

给出补全后的完整源码。说明程序中两个空填写的依据。

由于程序段地址在cs中,所以将cs赋值给ds,第一处填cs。

 

将程序装载后,使用u命令观察到,程序由0706A:0000开始到0706A:001B结束,共001CH个字节,而后两行代码占(1B-17+1)5个字节,所以第二处应填0017H。

debug中调试,使用g命令将程序执行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令对0:200开始的内存单元反汇编,确认是否把task7.asm中line3-line12的代码复制到了目标内存空间。 给出使用g命令运行到指定点和使用u命令反汇编0:200到复制代码长度这一段内存空间的截图。 

·实验总结(选)

通过本次实验,我充分练习并熟练掌握了debug,masm,link的用法,了解了内存地址空间的分布。

在实验7中,我了解到,可以通过CX寄存器中的内容查看程序段的大小,并且用u命令查看指定代码所占的字节空间。

实模式:实模式下的寄存器都是16位的,且可直接对内存进行操作。

保护模式:将CPU的寄存器和运算单元扩展成32位的,增加了一些控制寄存器和段寄存器。

长模式:使得CPU在现有基础上有了64位的寻址能力,能完成64位的数据运算。

posted @ 2021-10-22 14:53  May==  阅读(104)  评论(4编辑  收藏  举报