实验内容(第一章实验任务):
第一题:
第一步:键入书上提供的代码(如下图):
键入代码的另一种方式(如下图)
使用e命令,向内存中写入二进制数据。(以下操作均在另一台机器上完成,所以会出现地址数据不相同的状况)并使用u反汇编查看在内存中写入的代码:
第二步:对代码逐条执行,并查看每一条代码执行后cs:ip的值的变化(如下图):
1~4:
5~8:
9~12:
13~14:
第二题:
第一步:将书上的代码打入2000:0内存单元中(如下图):
第二步:
使用r命令改写cs,ip中的值并查看(如下图):
第三步:逐条执行代码(如下图):
1~5:
6~9:
10~13:
14~16:
可以发现当执行到16次时,add ax,ax刚好执行了8次,执行一次是2的一次方,那么执行到第八次就是2的八次方了。
第三题:
第一步:按照书上的要求,查找fff0:0~fff0:00f0之间的地址单元(包括首尾)中存放的主板ROM中的生产日期(如下图):
第二步:对日期进行改写(如下图):
改写成功。
第四题:
第一步:按书上的要求在对应的地址单元处打入二进制代码(如下图):
第二步:对各个代码进行改写,猜测它们的作用(改写过程如下):
发现:将b810:0开始存放的数据看成是字型数据,低位字节控制形状,而高位字节控制颜色。
实验总结:1.本次实验主要训练了READUT这几条命令的使用。
对这几条命令的用法总结:
a) R命令:r命令用来查看当前各个寄存器中的数据情况,也可以用r命令加上寄存器名称来达到查看某一个寄存器的值和修改它的值的作用。具体写法:
-r
-r IP/AX/BX…
b) D命令:d命令用来查看内存中储存的数据,几种写法:
-d 1000:0(我想查看这个地址以后(包括这个地址)的内存单元中存储的数据)
-d(查看当前cs:ip所指向的位置及以后的内存单元中的值(默认128个))
-d 段地址:偏移地址 L5(表示从当前地址开始数起向后五个)/208(表示从当前地址开始一直显示到偏移地址为208的位置)
c) E命令:e命令用来改写内存中的内容。
-e 1000:0(注意:必须加地址作为参数,否则报错)(表示从1000:0向后改写数据)
其中:这条命令后续可以使用空格直接改写,还可以使用<Enter>键后一边查看一边改写。
-e 1000:0“abcde”和-e ’9’ ‘8’ ‘7’和-e 1000:0 ‘a’ ‘b’ 这几条指令都是将真正的字母、数字数据写入内存中。
d) A命令:以汇编语言的形式写入指令。
-a <回车>表示从当前cs:ip指向位置写指令。
-a 1000:0表示从指定位置写指令。
e) T命令:进行单步调试。
-t 表示从当前cs:ip指向位置单步执行
-t=1000:0表示从指定位置单步执行(这条语句包括了为cs:ip重新赋值的过程)
f) U命令:反汇编命令。
-u表示从当前cs:ip指向的位置向后看32个字节的内容,并把机器码翻译成汇编语言。
-u 1000:0 l5/208(同d命令,查看内容包括偏移地址为208的内存单元)。
g) G命令:类似于高级语言编译器中的编译并执行。
-g 0005 表示从当前cs:ip所指向的位置向后执行语句,一直执行到偏移地址为0005的地址单元之前(不包括0005),具体-g后面的参数怎么带还要看情况。
-g 0:200 0:208表示从0:200执行到0:207。
2.认识到了可以通过对程序执行次数的控制来实现计算(注意到2+2=2*2)。
3.认识到可以通过对内存中数据的控制来实现图形,颜色等其他信息的控制。