Assembly实验一

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  (侵删)

posted @ 2018-10-26 13:42  万里小南王  阅读(215)  评论(2编辑  收藏  举报