1、使用debug语句输入程序并逐条执行。
注意此处输入机器码时用命令e,而输入汇编指令时用命令a,此二者可由反汇编u查看到彼此。此题比较简单,直接上图。
(输入代码并由-t单步逐条执行)
(对汇编指令反汇编查看机器码)
(对机器码反汇编查看汇编指令)
2、将三条指令从指定内存单元输入并计算2的8次方。
三条指令为:
mov ax,1
add ax,ax
jmp 2000:0003
由-a将它们以此输入,并用-r查看与修改cs、ip指针,为下一步语句的执行做准备。具体操作如下图所示:
我注意到第2、3条语句每执行一边相当于是乘了一次2,而要求2的8次方便相当于是让它们执行8次,也就是说一共执行17条语句(别忘了第一次还要执行第一条语句)。由于这三条语句是一个不会自己终止的循环,所以g指令在此不适用,而应当选用-t加上所要执行的语句条数。
一开始,我错误地输入了-t 17
结果如下图:
我发现原本应为0100的ax被多乘了四次2,原来,在dosbox中默认采用16进制输入,所以此处想要执行十进制中的17条语句便应当输入十六进制中的11.
改变写法后,正确结果如下:
3、PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个日期并试图改变它。
本题可通过d 段地址:偏移地址1 偏移地址2(或用l+数字表示的长度)来查看从【段地址:偏移地址1】表示的内存开始到偏移地址2的内容
输入-d f000:ff00 ffff后结果如下图:
可知题中提到的生产日期为1992.1.1,且该日期存在内存单元FFFF0H中。
用e命令试图改变它的值,多次尝试失败,放弃挣扎,结果如下图:
后来再仔细一看题目,原来这是一个ROM(只读存储器),我内心........
不过在试图改变这个值的过程中我熟练掌握了指令e的各种用法,记录如下:
e :用于改写内存中内容
用法1:
写法:-e 段地址:偏移地址 要改写的内容
用途:从所写地址开始改写内存中的内容
用法2:
写法:-e ‘字符’ ……
用途:从当前cs:ip地址开始改写内存中的内容,并将字符以ASCLL码的形式存入内存单元中
用法3:
写法:-e 段地址:偏移地址
用法:从所写地址开始逐个改写内存中的内容,按下回车后地址中的远值会自动出现,在原值后输入想要改写的数即可。按空格进入下一个值的修改。若不想修改该值,则直接按空格跳过。修改结束按回车。
4、向内存B8100H开始的单元中填写数据,然后分别改编填写的数据和填写的地址,观察产生的现象。
话不多说,直接上图:
我发现改变数据可改变那几个小亮点的颜色和形状,而改变地址如改成b820:0000可改变小亮点的位置。
可改变地址时选用有些地址(如a880:1000)则看不出任何改变,我猜测是内存中分配了专门的b810:0000附近的空间来改变小亮点的位置。
小小总结一下:
通过这次实验,我熟练掌握了debug环境中几个基础命令的使用,还在操作错误中发现了之前不知道的知识点(如dosbox中默认以16进制输入)。
这次实验只是一个开始,它让我初步体会到了汇编的乐趣。我也会在接下来的学习中再接再厉,尽情地探索这门语言地奥秘。
我在班级博客中发现有一位同学(@无ni不欢)对各个命令做了非常详尽全面的说明,在此与大家分享:https://www.cnblogs.com/cjh-1023/p/9852399.html (侵删)