前言

本系列的文章是对王爽老师的汇编语言中的实验的解答记录,原书一共有17个实验,由于学校的教学流程只做到了第14个实验,因此本文章只会有前十四个实验的解答记录,还有个比较重要的是,文章中会有原书实验中没有的题目,这些是我的老师自己加的,你不感兴趣就无视。btw,以这篇文章记录我的汇编语言的学习历程

目录

实验任务

(1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中

相关寄存器中内容的变化。

提示,可用E命令和A命令以两种方式将指令写入内存。注意用T命令执行时,CS:IP的指向。注:由于篇幅问题,图片仅展示一部分!

解答:

使用A指令编写汇编指令,这里必须注意填写数值的时候不要有H!

更改CS:IP的指向

执行命令,AX和BX的值发生更改

(2)将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。

1
2
3
mov ax,1
add ax,ax
jmp 2000:0003

解答:

使用A命令编写汇编指令,这里有个小细节,用r命令修改寄存器的值可以不用空格隔开,比如rip就能直接修改ip寄存器的值

执行命令

(3) 查看内存中的内容。

PC机主板上的ROM中写有一个生产日期,在内存FFF00H〜FFFFFH的某几个单元中,请找到这个生产日期并试图改变它。

解答:

FFF00H\~FFFFFH跨度是FF,因此运行

-d fff00:0 ff

地址FFF0:00F0即是生产日期

试图修改,发现报错,原因后面分析

(4) 向内存从B8100H开始的单元中填写数据,如:-e B810:0000 01 01 02 02 03 03 04 04

解答:

检测点2.1

解答:

随便找一个内存段,使用A命令写入指令

修改CS:IP寄存器

执行命令

实验结论、实验体会

以下是对于每道题运算结果的个人看法与总结,有错请指正

第一题:

  • 采用e指令或者a指令都可以达到预期的实验的目的
  • e指令采用机器码的形式直接对连续的内存地址进行修改的,稍有不慎,会计算出错
  • a指令,选择一个段地址,可以在这上面直接用汇编语言进行编写,不容易出错和便于检查。
  • t指令,必须先修改cs和ip段寄存器的内容,指向要运行的程序段,否则则不会运行我们编写的程序

第二题:

  • jmp是一个跳转指令,可以跳转到我们需要它跳转的物理地址上
  • 在编写运行一个新的程序时,必须把上一个程序运行完成,否则无法进行改写
  • 直接修改cs和ip的值可以提前跳出循环

第三题:

  • 执行结果生产日期与我的电脑不符合,查阅资料——dosbox是虚拟机,也就是虚拟环境,因此输出的内容和物理机的信息没有任何关系
  • 通过数字逻辑的知识,ROM为只读存储器,因此修改FFFF0会报错

第四题:

  • 现象:用e命令修改内存单元后,用d命令查看内容并未修改
  • 查阅:该处地址单元位于显存地址单元中,可以进行数据的写操作
  • 原因:显存单元中的内容是与屏幕输出是同步的,再用d命令查看是显存中的内容已经发生了改变

检测点2.1:

没啥好说的,程序运行的结果与手算的结果相一致,是验证性的一类实验