汇编语言实验二

时间:2022-07-01 12:48:05

实验前的一些总结:

  • 关于d命令

(1)我们可以用“d 段地址:偏移地址”的格式查看制定内存单元的内容;

(2)在处理d命令时,Debug有将段地址送入段寄存器ds的代码,CPU在访问内存单元时就可以从ds中得到段地址;

(3)一些例子:

-r ds
:1000
-d ds:0     ;查看从1000:0开始的内存空间中的内容
  • 在e,a,u命令中使用段寄存器

(1)一些例子:

-r ds
:1000
-e ds:0 11 22 33 44 55 66   ;在1000:0开始的内存区间写入数据
-u cs:0   ;以汇编指令的形式,显示当前代码段中的代码,0代码的偏移地址
-r ds
:1000
-a ds:0   ;以汇编指令的形式,向从1000:0开始的内存单元中写入指令
  • 初步认识中断机制

    通常来说,用t命令执行一条指令后,会停止执行,但当t命令在执行修改寄存器ss的指令时,下一条指令也紧接着被执行

实验开始:

  • 使用Debug写入程序段,逐条执行,体会中断机制

(1)先修改0021:0~0021:f的值,并用d命令查看是否修改成功

汇编语言实验二

(2)用a命令将程序段写入内存

汇编语言实验二

(3)先理论分析程序段后填空

汇编语言实验二

(4)然后用t命令逐条执行

汇编语言实验二

汇编语言实验二

汇编语言实验二

汇编语言实验二

小结:

    (1)对程序段的部分解读:

mov ax,0021
mov ds,ax       ;对段寄存器ds的赋值操作
mov ax,2200
mov ss,ax
mov sp,0100   ;安排了2200:0~2200:00FF为栈空间,初始化了栈顶

(2)在此程序段的运行中,用t命令逐条进行时,“mov sp 0100”看起来貌似并没有执行,但实际上在运行了“mov ss,ax”之后,ss和sp的值都改变了,所以其实“mov sp 0100”已经执行了。

  •  探究此程序段令2000:0~2000:f中的内容发生变化的原因

(1)用a命令输入程序段,再用e命令修改2000:0~2000:f的值,用d命令查看是否修改成功

汇编语言实验二

(2)然后先用r命令查看此时各寄存器的值,再用t命令逐条执行,每执行一条指令查看一次2000:0~2000:f中的值

汇编语言实验二

(3)从上图可以看到此时内存单元中还没有变化,继续用t命令逐条执行

汇编语言实验二

(4)从上图可以看到此时2000:0~2000:f中的值发生了变化,而且20006H对应了此时ax的值,2000AH对应了此时ip的值,2000CH对应了cs的值,继续用t命令执行

汇编语言实验二

(5)从上图我们可以发现随着ax和ip值的变化,此内存单元中也对应发生了变化,继续用t执行

汇编语言实验二

(6)从上图我们看到,ip值的变化也使此内存单元对应发生了变化,由于这段空间被定义为栈空间,随着ax中值的入栈,其他单元的数据往地址减小的方向移动了一个字数据,继续执行

汇编语言实验二

(7)随着ax的变化,此内存单元也对应变化了,再继续执行

汇编语言实验二

(8)从上图可以看到,随着ax值的入栈,此内存单元的数据再次往地址减小的方向移动一个字数据

小结:

(1)没有执行这段程序之前,ss的值为073F,sp的值为00FD,此时栈顶和栈底是ss:sp指向的地址,也就是说,初始的栈顶和栈底都是074EDH

(2)对部分程序段的解读:

mov ax,2000
mov ss,ax
mov sp,10  ;此处意味着栈空间是从20010H的上一个地址2000FH开始的,这里实际上初始化了栈顶
;此程序段安排了2000:0~2000:F为栈空间

(3)初步分析变化的原因:我认为在2000:0~2000:F被定义为栈空间之后,为了方便执行下一条指令,所以会将ip,cs,ax的值也入栈

实验体会:

  • 通过本次实验,我熟悉了mov,add,push,pop等指令的用法,学会了如何去定义一个堆栈,如何初始化栈顶,对堆栈有了更深入的了解。此外我也初步了解了Debug的中断机制。
  • 对于第二个小实验,我上网搜索得到网友的一些见解:(目前还是未能深入理解)

(1)执行mov ss,ax 时其后边的指令将立即被执行(这是MOV SS,**指令特点)。这也是为什么强调mov ss,ax 后边必须跟上mov sp,10的原因。这么规定是便于控制栈段大小,防止特别是在有子程序调用时出错。至于这两条指令执行后靠近栈顶的10个字节中值立即有了变化,是对定义栈段部分运行环境变量进行暂存,靠近栈顶的10个字节中的暂存数据分别是SS、IP、 CS 等的值。

(2)这是由于单步中断所导致的结果:(至于标志寄存器,cs:ip入栈后其他堆栈内容的改变是中断处理程序执行过程中改变的)

汇编语言实验二