实验2 用机器指令和汇编指令编程

实验2 用机器指令和汇编指令编程

1、预备知识:Debug的使用

(1)、D、E、A、U命令的新用法

​ 上次实验中查看指定的内存单元的内容的方法是 “-d 段地址:偏移地址”,即直接给出段地址以及偏移地址,但这种操作方式是 Debug 程序提供的一种直观的操作方式。实际上,Debug 在执行这样的命令时,也会将段地址先送入段寄存器中。而这个段寄存器不是别人,正是专业储存数据地址的段寄存器 DS(Data Section)难道这也在你的计算中吗jojo?

​ 因此,D 命令也提供了一种符合 CPU 运转机理的格式:"-d 段寄存器:偏移地址",以段寄存器中的数据为段地址 SA。

-r ds 
: 1000
-d ds:0 f		;查看从1000:0000H ~ 1000:000fH的内存空间中的内容
-d cs:0			;查看当前代码段中的指令代码
-d ss:0			;查看当前栈段中的内容

E、A、U 指令同理,此处不再赘述。

(2)、消失的指令

是的,你没有看错,这个小标题对应的段落不是走近科学的文案,而是今天实验内容的一部分

让我们来看下面这段指令:

实验2 用机器指令和汇编指令编程_第1张图片

​ 在使用T命令执行 “mov ax,2000” 后,显示出当前 CPU 寄存器的状态和下一步要执行的指令:“mov ss,ax”;

​ 但是,在使用 T 命令单步执行 “mov ss,ax” 后,我们发现了一个问题: “mov ss,ax” 的下一条指令应该是 “mov sp,10” ,但是现在怎么变成了它的下一条指令 “mov ax,3123”

​ 那么, “mov sp,10” 是已经被执行了吗?还是说直接被跳过了呢?

​ 仔细观察发现:在程序执行前,sp = ffee,而在程序执行之后,sp 变成了 0010,所以说, “mov sp,10” 已经得到了执行,并且是在执行完 “mov ss,ax” 的时候紧接着执行的。

一般情况下,使用 T 命令执行一条指令后,它的下一条指令会停止继续执行,显示出当前CPU各个寄存器的状态以及下一步要执行的指令,但是显然T命令执行 “mov ss,ax” 的时候没有做到这一点。并且据实验表明,对于其他修改栈段寄存器(Stack Section)SS的指令如 “mov ss,[0]”“pop ss” 等指令时都会发生上述情况。

​ 那么,到底是什么导致了这一点呢?请容我卖个关子,在文章的最后揭晓。

2、实验任务

(1)、使用 Debug ,将下面的程序写入内存,逐条执行,并按要求填空

实验2 用机器指令和汇编指令编程_第2张图片实验2 用机器指令和汇编指令编程_第3张图片
毫无意外的, “mov sp,0100” 这句代码又一次被直接执行了。
在这里插入图片描述

别忘了,栈的储存方式是从栈顶压入,所以这个push压栈指令存入AX中的十六位数据的时候,高地址单元中存放的实际上是高位数据,也就是说,数据的前后两位被颠倒了

在这里插入图片描述
实验2 用机器指令和汇编指令编程_第4张图片
实验2 用机器指令和汇编指令编程_第5张图片

实验结果:

实验2 用机器指令和汇编指令编程_第6张图片

(2)、离奇改变的内存空间

让我们来看看这个问题:

实验2 用机器指令和汇编指令编程_第7张图片
实验2 用机器指令和汇编指令编程_第8张图片
让我们进行分析:

首先,我没有任何访问内存的动作

其次,我只是把数据在寄存器之间进行了复制操作

但是看内存的数值,它确实发生了改变

所以,到底为什么内存数据会自己改变呢?

聪明的我当机立断,抄起一根ddr4内存条含到嘴里,结合互联网上的蛛丝马迹,我推断出了答案
实验2 用机器指令和汇编指令编程_第9张图片
实验2 用机器指令和汇编指令编程_第10张图片

根据目前手上的线索,答案可能就是当 Debug 程序使用 T 命令一条一条的执行指令时,可能会先将寄存器中的值先行压入栈中再执行原来的执行一条指令暂停一次的中断操作,以保证数据的安全。

而当我们更改了栈段寄存器SS的值的时候,因为栈段的位置改变了,而偏移地址的位置没有改变,所以Debug默认下一条指令是更改栈指针寄存器(Stack Pointer)SP的值,以便确认新的栈段位置后才执行中断指令把寄存器的值压入栈中保存。

结合这个大胆的推断,我们来看内存的值,果然,内存中储存的值与寄存器中的值是一一对应的

随后,我们带着方向到网上寻求正解:
实验2 用机器指令和汇编指令编程_第11张图片

我们的大胆推论终于还是得到了证实,我愿称之为”走进科学-程序员专栏-万圣节特别节目——Debug背后的神秘阴影“,总之,这就是学习的精华与魅力所在——大胆胡说,小心求证,希望大家能和我一起在汇编(tutou)的路上越走越远

你可能感兴趣的:(学习笔记,debug,mov,寄存器,cpu)