实验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位的数据运算。