d命令查看生产日期的截图如下
其中最后一行01/01/92表示生产日期为1992年1月1日
使用e命令修改生产日期以及修改后d命令再次查看的结果截图如下
结论:无法修改,因为该信息存储在ROM中,只读存储器不允许用户修改内容
用e命令修改内存单元的命令的效果截图如下所示
用f命令批量填充内存单元的效果截图如下所示
尝试修改内存单元或数据后的效果截图如下所示
1 mov ax, 20 2 mov ds, ax 3 mov ss, ax 4 mov sp, 30 5 push [0] ; 执行后,寄存器(sp) = 2e 6 push [2] ; 执行后,寄存器(sp) = 2c 7 push [4] ; 执行后,寄存器(sp) = 2a 8 push [6] ; 执行后,寄存器(sp) = 28 9 pop [6] ; 执行后,寄存器(sp) = 2a 10 pop [4] ; 执行后,寄存器(sp) = 2c 11 pop [2] ; 执行后,寄存器(sp) = 2e 12 pop [0] ; 执行后,寄存器(sp) = 30问题1:题目要求是把00220H ~ 0022fH用作栈空间。指令 mov ss, ax 和 mov sp, 30 执行后,栈顶的逻辑地址和物理地址分别是? 答: 栈顶的逻辑地址是0020:30,栈顶的物理地址是00230 问题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查看此时数据空间内的数据是否有变化。给出实验截图。
答:数据发生了变化,实验截图如下所示
1 assume cs:code 2 code segment 3 start: 4 mov cx, 10 5 mov dl, '0' 6 s: mov ah, 2 7 int 21h 8 add dl, 1 9 loop s 10 11 mov ah, 4ch 12 int 21h 13 code ends 14 end start
masm截图如下
link截图如下
运行结果如下
用debug调试task6.exe并单步执行的截图如下
由于cs=076A,IP=0003,故而在使用d指令时,使用d 076a:0便可以看到CD 20
按照以下步骤分析题目
1.观察给出的代码段,发现有两处需要填写
2.阅读代码段,了解大致含义
循环前的代码主要是进行了各寄存器的数据存储工作,为后来的循环做准备
循环的作用是复制代码段到es:[bx]中,是本题的核心
3. 理解各个寄存器中的数值含义
ds中存储的应该是代码段的起始地址
es中存储的是复制的目的地址
bx用于控制复制哪一句代码到目的地址
cx用于控制循环次数
4.在理解了各个寄存器中存储数据的含义后,便可以轻松的出以下结论
4.1 ds在本程序中仅进行了一次赋值(mov ds,ax),所以本次赋值一定是将程序段的开始地址给了ds,所以ax此时一定是与cs一致,所以第一空为cs
4.2 cx在本程序中仅进行了一次赋值(mov cx,__),本次赋值的最后一个操作数应该是需要复制的程序的长度
因为在debug时cx中存储的是程序段的总长度,故可以现在第二空中填上cx,并链接,执行,并在0:200中反汇编,获得结果如下图所示
由图中可知,从程序开始到循环,一共占用了16h的空间,此时再将task7.asm中第二空填上16h,链接,执行,即可得到正确结果,如下图所示
本次实验以调试程序,观察运行结果以及寄存器中数值变化为主,通过手动操作的方式,已经学习过的内容进行了复习与查漏补缺,具体收获如下所示
1.复习了dosbox的使用以及各种命令的作用
1.1 为了能够使用debug工具,必须在dosbox中增加虚拟盘,并将对应文件夹挂在在其下,随后进入该虚拟盘符,该步骤一共有两条语句
Z:\>mount d: d:/masm Z:\>d:
2.ROM中的数据不可修改