实验1 用汇编指令编码和调试
实验结论
2.实验任务2
使用d命令查看生产时期的截图,时间为01/01/92:
使用e命令修改生产日期所在内存单元的截图,以及,修改后,再次使用d命令查看的截图:
结论:不能修改
原因分析:地址A000H~FFFFH的24KB空间为各个ROM的地址空间,ROM为只读存储器,我们对只读存储器进行写入,改写操作都是无效的。
3.实验任务3
在debug中使用e命令修改内存单元的命令,及,效果截图:
在debug中使用f命令批量填充内存单元的命令,及,效果截图:
改变数据后的截图
4.实验任务4
-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执行后,栈顶的逻辑地址和物理地址分别是?
答:栈顶的逻辑地址是0020:0030H,物理地址是00230H。
问题2:单步调试到汇编指令push [6]执行结束,pop [6]执行之前,使用d 20:20 2f查看此时栈空间数据,给出实验截图。
问题3:汇编指令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 ss, ax时,同时执行了mov sp,30这条指令。
mov sp,30在执行mov ss, ax时同时执行了。
问题2:根据汇编指令,前三条指令执行后,00220H ~ 0022fH被设置为栈空间。并且,初始时,已通过f命令将初始栈空间全部填充为0。观察单步调试时,栈空间00220H ~ 0022fH内存单元值的变化,特别是图示中黄色下划线表示出的数据值。根据实验观察,尝试思考和分析原因。
答:黄色下划线是下一条命令的逻辑地址,debug使用t指令引发了中断,中断过程使用了当前栈空间存放cpu关键数据。
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对程序汇编链接过程截图,以及,运行可执行程序task6.exe的运行结果截图:
在debug中查看task6.exe的程序段前缀PSP的截图:
证明前两个字节是CD 20。
7.实验任务7
(1)
mov ax,cs
要复制的开头是程序开头,即需要指向程序段开头。
mov cx,23
到loop s一共23字节,刚好复制完成。
assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,23 s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
(2)
答:确认把task7.asm中line3-line12的代码复制到了目标内存空间。
实验总结
1. 修改的内存空间需要注意,0~7FFFH为主随机存储器的地址空间,这部分可以修改,不过没有输出。8000H~9FFFH为显存地址空间,即放置其中的数据会有输出的显示,实验任务3正是证明了这一点。而A000H~FFFH为ROM地址空间,只读,对其进行修改操作无效。
2.对于显存空间的数据不显示时,可以通过cls清屏命令清屏后让其显示出来。