实验1 8086汇编指令编码和调试
一、实验结论
1.实验任务1
无
2.实验任务2
- 给出使用d命令查看生产时期的截图

- 给出使用e命令修改生产日期所在内存单元的截图,以及,修改后,再次使用d命令查看的截图

- 结论:无法修改,因为由下图可知生产日期所在内存单元为ROM。(Rom只读存储器(Read-Only Memory,ROM)以非破坏性读出方式工作,只能读出无法写入信息)

3.实验任务3
- 给出在debug中使用e命令修改内存单元的命令,及,效果截图

- 给出在debug中使用f命令批量填充内存单元的命令,及,效果截图

- 尝试修改内存单元,或,数据后的效果截图
修改数据为41 02

4.实验任务4
根据在debug环境中调试观察结果,填空并回答问题。
- 填空
-a mov ax, 20 mov ds, ax mov ss, ax mov sp, 30 push [0] ; 执行后,寄存器(sp) = 002E push [2] ; 执行后,寄存器(sp) = 002C push [4] ; 执行后,寄存器(sp) = 002A push [6] ; 执行后,寄存器(sp) = 0028 pop [6] ; 执行后,寄存器(sp) = 002A pop [4] ; 执行后,寄存器(sp) = 002C pop [2] ; 执行后,寄存器(sp) = 002E pop [0] ; 执行后,寄存器(sp) = 0030
- 回答问题
问题1:题目要求是把00220H ~ 0022fH用作栈空间。指令 mov ss, ax 和 mov sp, 30 执行后, 栈顶的逻辑地址和物理地址分别是?
逻辑地址:0020:0030
物理地址:00230
问题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:使用t命令单步执行 mov ss, ax 时,是单步执行完这一条指令就暂停了吗?后面的指令 mov sp, 30 是什么时候执行的?

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

分析原因:00220H ~ 0022fH内存空间里有存放cs和ip,随着cs和ip的变化而变化
6.实验任务6
- 给出程序源码
task6.asm
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的截图。

程序段前缀为前256个字节的内容,256转换为16进制为100,由图可知,前两个字节是CD 20。
7.实验任务7
- 给出补全后的完整源码。说明程序中两个空填写的依据。
assume cs:code code segment mov ax, cs mov ds, ax mov ax, 0020h mov es, ax mov bx, 0 mov cx, 17h s: mov al, [bx] mov es:[bx], al inc bx loop s mov ax, 4c00h int 21h code ends end
第一个空cs,因为CS:IP指向程序第一条指令,所以要复制整个程序,需要将段地址cs赋值给寄存器ds
第二个空17h,因为cx表示循环次数,也就是指令总长度。要得到指令长度,先填写Mov cx,1h,进行debug,用t执行,观察寄存器数据,IP数值表示mov ax,4c00的位置,所以0000-0016为之前的指令内容,所以指令长度为17个字节。
也可以直接计算指令长度:2+2+3+2+3+3+2+2+2+2=23=17h 。

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

二、实验总结
- 栈空间由高到低存储,ss:sp指向栈顶。
- 指令长度计算:没有操作数的指令,指令长度为1字节。如es:;操作数只涉及寄存器的指令,指令长度为2字节。如mov al,[si]、mov ds,ax;操作数涉及内存地址的指令,指令长度为3字节。如mov al,[bx+1]、mov [2345],ax;操作数涉及立即数的指令,指令长度为:寄存器类型+2。8位寄存器,寄存器类型=1;16位寄存器,寄存器类型=2。如mov al,8 ;指令长度为2、mov ax,8 ;指令长度为3。
- Inc加一指令,Dec减一指令。
- T程序终止会继续进行运行;P命令作用:执行汇编程序,单步跟踪。与T命令不同的是:p运行到程序结束直接终止;G命令的使用方法是:G [=起始地址] [断点地址],意思是从起始地址开始执行到断点地址。如果不设置断点,则程序一直运行到中止指令才停止。
浙公网安备 33010602011771号