资源描述:
《实验2 用机器指令和汇编指令编程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、3第3章寄存器(内存访问)实验2用机器指令和汇编指令编程1.预备知识:Debug的使用前面实验中,讲了Debug一些主要命令的用法,这里,我们再补充一些关于Debug的知识。(1)关于D命令从上次实验中,我们知道,D命令是查看内存单元的命令,可以用:d段地址:偏移地址的格式查看指定的内存单元的内容,上次实验中,D命令后面的段地址和偏移地址都是直接给出的。现在,我们知道段地址是放在段寄存器中的,在D命令后面直接给出段地址,是Debug提供的一种直观的操作方式。D命令是由Debug执行的,Debug在执行“d1000:0”这样的命令时,也会先将段地址1000送入段寄
2、存器中。Debug是靠什么来执行D命令的?当然是一段程序。谁来执行这段程序?当然是CPU。CPU在访问内存单元的时候从哪里得到内存单元的段地址?从段寄存器中得到。所以,Debug在其处理D命令的程序段中,必须有将段地址送入段寄存器的代码。段寄存器有4个:CS、DS、SS、ES,将段地址送入哪个段寄存器呢?首先不能是CS,因为CS:IP必须指向Debug处理D命令的代码,也不能是SS,因为SS:SP要指向栈顶。这样只剩下了DS和ES可以选择,放在哪里呢?我们知道,访问内存的指令如“movax,[0]”等一般都默认段地址在ds中,所以Debug在执行如:“d段地址:
3、偏移地址”这种D命令时,将段地址送入ds中比较方便。D命令也提供了一种符合CPU机理的格式:“d段寄存器:偏移地址”,以段寄存器中的数据为段地址SA,列出从SA:偏移地址开始的内存区间中的数据。以下是4个例子:①-rds:1000-dds:0;查看从1000:0开始的内存区间中的内容②-rds:1000-dds:1018;查看1000:10~1000:18中的内容③-dcs:0;查看当前代码段中的指令代码④-dss:0;查看当前栈段中的内容(2)在E、A、U命令中使用段寄存器3第3章寄存器(内存访问)在E、A、U这些可以带有内存单元地址的命令中,也可以同D命令一
4、样,用段寄存器表示内存单元的段地址。以下是3个例子:①-rds:1000-eds:0112233445566;在从1000:0开始的内存区间中写入数据②-ucs:0;以汇编指令的形式,显示当前代码段中的代码,0代码的偏移地址③-rds:1000-ads:0;以汇编指令的形式,向从1000:0开始的内存单元中写入指令(3)下一条指令执行了吗?在Debug中,用A命令写一段程序:movax,2000movss,axmovsp,10;安排2000:0000~2000:000F为栈空间,初始化栈顶。movax,3123pushaxmovax,3366pushax;在栈中
5、压入两个数据。仔细看一下图3.18中单步执行的结果,读者发现了什么问题?在用T命令单步执行movax,2000后,显示出当前CPU各个寄存器的状态和下一步要执行的指令:movss,ax;在用T命令单步执行movss,ax后,显示出当前CPU各个寄存器的状态和下一步要执行的指令……,在这里我们发现了一个问题:movss,ax的下一条指令应该是movsp,10,怎么变成了movax,3123?3第3章寄存器(内存访问)图3.18movsp,10到哪里去了movsp,10到哪里去了?它被执行了吗?我们再仔细观察,发现:在程序执行前,ax=0000,ss=0b39,sp
6、=ffee在用T命令单步执行movax,2000后,ax=2000;ss=0b39;sp=ffee在用T命令单步执行movss,ax后,ax=2000;ss=2000;sp=0010注意,在用T命令单步执行movss,ax前,ss=0b39,sp=ffee,而执行后ss=2000,sp=0010。ss变为2000是正常的,这正是movss,ax的执行结果。可是sp变为0010是怎么回事?在这期间,能够将sp设为0010的只有指令movsp,10,看来,movsp,10一定是得到了执行。那么,movsp,10是在什么时候被执行的呢?当然是在movss,ax之后,因
7、为它就是movss,ax的下一条指令。显然,在用T命令执行movss,ax的时候,它的下一条指令movsp,10也紧接着执行了。整理一下我们分析的结果:在用T命令执行movss,ax的时候,它的下一条指令movsp,10也紧接着执行了。一般情况下,用T命令执行一条指令后,会停止继续执行,显示出当前CPU各个寄存器的状态和下一步要执行的指令,但T命令执行movss,ax的时候,没有做到这一点。不单是movss,ax,对于如:movss,bx,movss,[0],popss等指令都会发生上面的情况,这些指令有哪些共性呢?它们都是修改栈段寄存器SS的指令。为什么会这样
8、呢?要想彻底说清楚这里面