实验1 8086汇编指令编码和调试
2021/10/24 1:09:52
本文主要是介绍实验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指令。
也就是说Debug的T命令在执行修改寄存器ss的指令时,下一条指令也紧接着执行。
问题2:
首先观察下面这张截图
在debug下单步调试,执行一条指令,查看20:20这段内存单元的内容。
发现在执行mov ss,ax;mov sp,30这两条命令后,在0020:20 2f这段内存空间里的数据才发生变化。
然后根据上面多次实验观察,我们能够发现,0020:20 2f这段空间里面保存了下一条命令的地址,即当前CS:IP的值。
根据汇编指令,前三条指令执行后,00220H~0022fH被设置为栈空间。
在ss和sp联合设置栈段时,不响应单步中断,以保证栈段的正确位置。
而且在中断时,会对现场进行保护,cpu先将标志寄存器进栈,在把当前的CS值进栈,最后将IP进栈。
这也就是为什么栈内会出现其他数据的原因。
任务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对程序汇编链接过程截图,以及,运行可执行程序task6.exe的运行结果截图
在debug中查看task6.exe的程序段前缀PSP的截图
前两个字节确实为CD 20
任务7:
(1)
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
依据:
mov ax,cs;程序加载到内存时,cs:ip会初始化为程序的首个地址,而作为程序段的段值,ip为0,所以通过ax将cs的值赋值给ds。
mov cx,0017h;首先现在该位置填0,debug task7.exe之后使用u命令查看mov ax 4c00h这条命令的地址,如下图,发现是076A:0017,偏移地址是0017H,因此cx的值为0017H
(2)使用g命令运行到指定点和使用u命令反汇编0:200到复制代码长度这一段内存空间的截图。
可以发现,指令已经成功复制到0:200这段内存空间内了。
五:实验总结
(1)Debug的T命令在执行修改寄存器ss的指令时,下一条指令也紧接着执行。
(2)在每个程序段前,都会有一个程序段前缀PSP,大小为256个字节。DOS要利用PSP来和被加载的程序进行通信。
(3)u命令可以对机器代码进行反汇编。使用方法是 u [范围]
(4)t命令是利用了cpu提供的单步中断功能实现控制命令的单步执行。
(5)在实验任务5的问题2,我发现栈内保存CS:IP地址的前2个字节的值为00 00。
经查询这两个字节是TF和IF标志寄存器的值。是为了避免cpu在执行中断处理程序时发生单步中断。
具体内容详见书上第259页。
这篇关于实验1 8086汇编指令编码和调试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南