实验1 8086汇编指令编码和调试
四:实验结论
任务2:
使用d命令查看生产日期的截图:

使用e命令修改生产日期所在内存单元的截图

查看是否修改成功

结论:无法修改。原因是8086PC机在内存地址C0000~FFFFF这段地址空间是只读的各类ROM地址空间。
任务3:

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

尝试修改内存单元或数据后的效果截图 。修改成功。

任务4:
-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:
问题2:
问题3:

问题4:
任务5:
问题1:
使用T命令执行mov ss,ax时,不是单步执行完这条指令命令就暂停。mov sp,30这条指令紧接着mov ss,ax
指令和一同执行。因为debug分布调试的T命令是一种中断,CPU执行期间不响应中断请求。而是接着执行
它的下一条mov sp,30指令。
问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通过f命
令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特别是图示
中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。


由上面两张图可知,在执行mov ss,ax;mov sp,30这两条命令后,0020:20 2f这段内存空间里的数据才发生变
化。其中,08 01代表偏移地址,3F 07是程序段地址,当程序开始执行时会随着程序的进一步执行发生改变。
任务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
以下为运行task5.exe的运行结果截图:

在debug中查看task5.exe的程序段前缀PSP:

前两个字节为CD 20。
任务7:
assume cs:code code segment mov ax, cs mov ds, ax mov ax, 0020h mov es, ax mov bx, 0 mov cx, 0017h s: mov al, [bx] mov es:[bx], al inc bx loop s mov ax, 4c00h int 21h code ends end

(1) 补全程序。说明这样填写的依据。
依据:
mov ax,cs; 因为cs是程序段的入口,cs:ip会初始化为程序的首个地址
mov cx,0017h; cx是程序段的长度。因为本程序实现代码的自我复制,所以循环次数应该是程序段的总长
度减去"mov ax,4c00h"的长度3以及“int 21h”的长度2。由r命令知cx=001C,可得001C - 5 = 0017H。

由图可知,task7.asm中line3-line12的代码已经复制到了0:200这段内存空间内。
五:实验总结
1. 使用u命令可以对机器代码进行反汇编。
2. 在每个程序段前,都会有一个程序段前缀PSP,大小为256个字节。
3. t命令在执行修改寄存器ss的指令时,下一条指令也紧跟着执行。

浙公网安备 33010602011771号