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

四:实验结论

任务2:

使用d命令查看生产日期的截图:

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

 

 查看是否修改成功

 

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

 

任务3:

使用e命令修改内存单元的命令

 使用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:

指令 mov ss, ax 和 mov sp, 30 执行后,栈顶的逻辑地址是30 物理地址 0020:0030

问题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:

问题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
使用masm、link,汇编、链接,得到可执行文件task5.exe。运行程序。结合程序运行结果,理解程序功能。
使用debug工具,调试task5.exe。根据第4章所学知识,任何可执行程序在执行时,都有一个引导程序负责
将其加载到内存,并将CPU控制权移交给它,也即将CS:IP指向可执行程序中第一条机器指令。在加载可执
行程序时,可执行前面512字节是程序段前缀PSP(Program Segment Prefix),用于记录程序一些相关信息。
在debug中,使用d命令,查看task5.exe的程序段前缀,观察这256个字节的内容,验证前两个字节是否是
CD 20。
以下为使用masm、link对程序汇编链接过程截图:

以下为运行task5.exe的运行结果截图:

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

 

 前两个字节为CD 20。

 

任务7:

下面程序的功能是,完成自身代码的自我复制:把 mov ax, 4c00h 之前的指令复制到内存0:200开始的
连续的内存单元。
补全程序,并在debug中调试验证,确认是否正确实现了复制要求。
task7.asm 
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。

(2) 在debug中调试,使用g命令将程序执行到 loop s 之后、 mov ax, 4c00h 之前,然后,使用u命令
对0:200h开始的内存单元反汇编,确认是否把task7.asm中line3-line12的代码复制到了目标内存空间。 

 

由图可知,task7.asm中line3-line12的代码已经复制到了0:200这段内存空间内。

 

 五:实验总结

 1. 使用u命令可以对机器代码进行反汇编。

 2. 在每个程序段前,都会有一个程序段前缀PSP,大小为256个字节。

 3. t命令在执行修改寄存器ss的指令时,下一条指令也紧跟着执行。

 

 

 

posted @ 2021-10-24 16:22  freddy2002  阅读(98)  评论(3)    收藏  举报