四、实验结论
2.实验任务2
(1)使用d命令查看生产日期,在内存FFFF0H~FFFFFH单元发现生产时期是92年1月1日;
(2)使用e命令修改生产日期所在的内存单元,修改后,再次使用d命令查看,发现生产日期没有变化;
(3)不能修改生产日期,因为在进行实验的电脑上,地址C0000H~FFFFFH的内存单元为只读存储器,写入数据操作是无效的,因此生产日期无法改变。
实验命令及结果截图:
3.实验任务3
(1)在debug中,使用e命令修改内存单元b8000H~b8009H,
实验命令及效果截图:
(2)在debug中,使用f命令批量填充内存单元b8f00H~b8f9fH,
实验命令及效果截图:
(3)使用f命令修改内存单元b8f00H~b8f9fH的数据后,
实验命令及效果截图:
4.实验任务4
(1)指令mov ss,ax和mov sp,30执行后,栈顶的
逻辑地址:0020:0030H
物理地址:00230H
(2)push [6] 指令执行结束后, pop [6] 指令执行结束前,使用d命令 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也紧跟着执行了,由下图的逻辑地址空间的变化可以看出指令的执行:
实验命令及结果截图:
(2)实验观察发现在进行入栈操作时,栈空间中的内容发生了改变。
原因(思考及查阅相关参考资料):因为在debug使用t等指令引发了中断造成的,中断过程使用当前栈空间存放cpu关键数据,所以栈里就会有不是自己操作的数据了。
6.实验任务6
(1)
程序源码:
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
(2)使用masm、link对程序task6依次汇编、链接以及运行:
实验命令及结果截图:
(3)在debug中查看task6.exe的程序段前缀(共256个字节),验证前两个字节确实是CD 20:
实验命令及结果截图:
7.实验任务7
(1)
第一空填写cs:要完成自身代码的自我复制,首先要找到代码段的起始地址,并将该地址送入ds寄存器中,而cs寄存器存放的就是代码段的段地址,即起始地址,所以这一空处填写cs;
第二空填写17h:cx用作循环的计数器,本题即要保存代码段的长度,要在debug中反汇编查看mov ax,4c00h前代码段的总长度,查看知,长度为0-16h,即一共17个字节,如下图所示:
因此确定第二空填写17h。
程序源码:
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
(2)使用g命令运行到loop s之后、mov ax,4c00h之前:
实验命令及结果截图:
使用u命令反汇编0:200开始的内存单元:
实验命令及结果截图:
由上图可知,已经成功将task7.asm中的line3-line12的代码复制到了目标内存空间。
五、实验总结
(1)加深r、t、g、d、e等命令的功能,提高使用这些命令进行操作时的熟练程度;
(2)明白栈空间入栈和出栈数据的具体变化情况;
(3)加深了对一个源程序从写出到执行的具体过程,并可以熟练地完成源程序写出到执行地过程;
(4)巩固了不同寄存器的作用。