首页
社区
课程
招聘
[旧帖] 03寻址方式与指令系统 0.00雪花
发表于: 2012-1-15 22:30 1190

[旧帖] 03寻址方式与指令系统 0.00雪花

2012-1-15 22:30
1190
【例3-1-3】直接寻址示例2

在汇编语言指令中,可以用符号地址代替数值地址
如:MOV AX,X
或  MOV AX,[X]
我们接着我们再举一个例子。在这个例子中间我们再看这条MOV指令MOV BL,ES:[0100H]。它的源操作数的位置,跟我们上节课这个例子中间有一个不一样的地方。就是前面有一个ES冒号。后面这部分[0100H]的含义跟原来的是一样的。也就是说0100H给出的是操作数的地址。那么操作数的话呢应该在存储区域中间。前面这个ES我们把它称为段超越前缀。也就是说在系统默认的情况下,那么这个操作数应该是在数据段中间的。而现在,在这条指令中间我们指明了这个操作数,它是放在附加段中间。所以前面用附加段的段寄存器ES来说明。所以执行这条指令的时候,实际上我们是从附加段中间去取的数据。那么当然计算物理地址的时候我们需要知道附加段的段寄存器的值。那么假定我们告诉你,附加段段寄存器ES中间当前存放的内容是3000H。这样的话我们就可以来计算物理地址。那么物理地址计算的方法还是一样的。用3000H乘上16,那也就是说后面添上一个0,再加上指令中间给出的偏移量0100,那么得到的物理地址是30100H。好根据物理地址30100H,从指定的存储单元中间去取这个数据。把这个数据传送到BL中间。
那么这条指令MOV指令MOV BL,ES:[0100H]数据传送的是一个字节。也就是说8位的数据,所以执行的结果就是把30100中间存放的数据4B传送到了BL中间。实际上我们在用汇编语言编写程序时候。那么我们实际上是使用的是符号地址。也就是说在指令中间。我们给出的实际上就是一个变量名。比如说MOV AX,X中的X。把变量X中间的内容传送到AX中间。那么我们就可以这样来书写。或者我们写成这样的一个形式MOV AX,[X],也就是说X加了一个方括号。那么这两条指令的书写的格式,表示的含义是一样的。这儿的MOV AX,X中的X,实际上都是表明变量X的地址。
实际上我们在使用汇编语言编程的时候,更多的用的是MOV AX,X;MOV AX,[X]这样的格式。因为这些变量具体分配到存储器中间,它的地址到底等于多少。实际上是由系统来完成的,用户并不知道。
接着下面我们再来介绍第四种寻址方式,这种寻址方式叫做寄存器间接寻址方式。
4、寄存器间接寻址
   操作数在存储器中,操作数地址的偏移量在寄存器(BX、BP、SI、DI之一)中
(1)        以BX、SI、DI寄存器间接寻址
   操作数在数据段
   
(2)        以BP寄存器间接寻址
  操作数在栈段    物理地址=(SS)*16+(BP)
在这种寻址方式中间,操作数是放在存储器中间的。而操作数的地址的偏移量,放在一个寄存器中间。在这种寻址方式中间,我们可以用的寄存器有四个。就是BX、BP这两个基址寄存器,还有SI、DI这两个变址寄存器。那么如果说我们是以BX、SI、DI这三个寄存器来作为间接寻址的话,系统默认操作数应该在数据段中间。所以我们计算物理地址的时候,我们应该用数据段段寄存器DS中间的内容乘上16,然后加上相应的寄存器中间的值。那么如果说我们是用BP寄存器作为间接寻址的话系统默认的情况,操作数是在栈段。特别注意在这种情况下,操作数在栈段,这样我们计算物理地址的时候,我们应该用栈段的段寄存器。也就是说SS这个寄存器。那么也就是说SS寄存器中间的内容乘上16然后加上BP中间的内容。在8086中间我们规定寄存器间接寻址方式,我们只能用这四个寄存器(BX、BP、SI、DI)。那么换句话说,其它的寄存器是不能使用间接寻址方式的。当然在80X86机器中间,那么它对这个限制就加以否定了,也就是说所以的寄存器都可以使用。我们这门课程中间主要还是以8086为基础来使用。所以大家在使用寄存器间接寻址方式的时候,特别要注意。下面我们给出寄存器间接寻址方式的几个例子。
【例3-1-4】寄存器间接寻址示例
     MOV AL,[BX]
     MOV AX,[SI]
     MOV DX,[BP]
在这几条MOV指令中间,源操作数都是用的寄存器间接寻址。在这条指令MOV AL,[BX]中间,我们用的是BX。在第二条指令MOV AX,[SI]中间,我们用的是SI。在第三条指令MOV DX,[BP]中间,我们用的是BP。大家注意到,使用寄存器间接寻址方式的时候。我们怎么来书写,也就是说我们怎么来表示。那么寄存器间接寻址方式表示的时候,是寄存器名加了一个方括号。所以这样的一种书写方式,那么就表明是寄存器间接寻址方式。

我们具体给出一些数字来计算一下,我们看这条MOV指令MOV AL,[BX]。在这条MOV指令中间,源操作数我们是以BX作为寄存器间接寻址。那么按照系统默认的情况,操作数应该在数据段中间。操作数的偏移量在BX中。所以当我们计算物理地址的时候,我们需要知道数据段的段寄存器DS的内容。当然我们还要知道当前BX中间存放的地址的偏移量。那么假定这两个值我们都已经知道了。设(DS)=1000H,(BX)=0B10H,这样我们就可以来计算物理地址。物理地址计算的方法跟以前一样。我们就不再仔细的说明了。好计算得到的物理地址是10B10H。这样的话,也就是说我们根据这个物理地址,我们就可以到指定的存储器中间取出这个操作数,操作数就是40H。把40H传送到AL寄存器中间。所以这条指令执行的结果寄存器AL中间的数据,应该为40H。那么这种寻址方式我们称为寄存器间接寻址。
5、基址寻址方式
操作数的有效地址是基址寄存器(BX、BP)的内容加上指令中指定的位移量(8位或16位)
【例3-1-5】基址寻址示例
MOV SI,[BX+1400H](或MOV SI,1400H[BX])若(DS)=10A0H,(BX)=0B00H

下面我们再来看基址寻址方式。基址寻址方式,也就是说操作数的有效地址是在基址寄存器中间的内容再加上指令中间给出的一个位移量。那么基址寄存器呢有两个,一个是BX,一个是BP。指令中间指定的位移量可以是8位也可以是16位。那么有了有效地址以后,当然我们就可以计算物理地址,也可以得到操作数了。所以在这种寻址方式中间,操作数仍然是在存储器中间的。
我们来看一个例子。在这条MOV指令MOV SI,[BX+1400H]中间,这个源操作数部分是BX+1400H,BX就是一个基址寄存器,1400H就是我们指定的位移量。在这个例子中间位移量是16位的,那么因为我们使用的是BX基址寄存器,所以按照系统默认的状态,操作数应该在数据段中间。所以假如说我们知道数据段的段寄存器DS的内容是10A0H,而当前BX中间存放的数据是0B00H。这样我们就可以计算物理地址。物理地址的计算就是DS的值乘上16然后加上BX的内容再加上指令中间给定的位移量,也就是1400H,那么得到的结果就是12900H。大家注意在这个,计算物理地址的这个加法的算式中间,我们是用16进制来做加法的。那也就是说我们两个数相加的时候,应该是封16进1。所以我们最后得到的结果是12900H,这就是物理地址。好根据这个物理地址,我们就可以到指定的存储器中间去取得数据。那么假定当前在存储器中间存放的数据是这样的一个状态,60H、30H。所以这条MOV指令MOV SI,[BX+1400H]执行的时候,那么它就把地址12900H中间,一个字的数据取出来传送到SI寄存器中间。执行的结果SI中间的内容,应该是3060H。在用基址寻址表示的时候,我们注意到可以有不同的书写方式。在这个例子中间,我们可以把这条MOV指令MOV SI,[BX+1400H]写成这样一种格式MOV SI,1400H[BX]。也就是说我们把这个指定的位移量写到了方括号的外面,把BX还留在这个方括号里面。那么这两种书写的方式其实含义是一样的。大家在看书,或者在看其它的参考书的时候,可以注意到这样的一些不同书写的方式。
6、变址寻址
   操作数的有效地址是变址寄存器(SI、DI)的内容加上指令中指定的位移量(8位或16位)
再下面一种寻址方式称为变址寻址方式。变址寻址方式跟基址寻址方式非常的类似。实际上就把基址寄存器换成变址寄存器就行了。所以在变址寻址方式中,操作数的有效地址就是变址寄存器的内容再加上指令中间指定的位移量。那么变址寄存器的话呢有两个SI或者是DI。位移量同样的可以是8位也可以是16位。因为这种寻址方式跟基址寻址方式非常类似我们就不举例子了。
7、基址变址寻址
   操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和
我们再来看下一种寻址方式。那么这种寻址方式叫做基址变址寻址。实际上我们从它的名称大概也能够猜想到,这种寻址方式表示的是操作数的有效地址是一个基址寄存器和一个变址寄存器内容的合。也就是说它使用了一个基址寄存器同时又使用了一个变址寄存器,把这两个寄存器内容的合加起来,这就是操作数的有效地址。
【例3-1-6】基址变址寻址示例
MOV DX,[BX+SI];((DS)*16+(BX)+(SI))-->DX
MOV AL,[BX][DI]
MOV CL,[BP+SI];((SS)*16+(BP)+(SI))-->CL
MOV CX,[BP][DI]
那么我们来看上面的这几条MOV指令中间,源操作数的寻址方式。在第一条MOV指令MOV DX,[BX+SI]中间,我们使用的是BX和SI。BX是基址寄存器,SI是变址寄存器,那么这条指令MOV DX,[BX+SI]执行的时候,也就是说我们计算物理地址的时候,应该用DS段寄存器中间的内容乘上16然后加上BX寄存器的内容再加上SI的内容。这样得到了物理地址。根据这个物理地址去取操作数,把取得的操作数传送到DX中间。第二条指令MOV AL,[BX][DI]中间我们用的是BX基址寄存器,用的是DI变址寄存器。我们注意到这两条指令书写的方法又有点不太一样。其实这两种书写方式都是可以的。也就是说我们可以把基址寄存器和变址寄存器放在一个方括号中间,用加号把它连起来。或者我们把基址寄存器、变址寄存器分别的用方括号把它括起来。那么这两种书写方式,我们选择其中的一种书写方式就可以了。因为它们是等效的。好我们再看下面两条指令MOV CL,[BP+SI];MOV CX,[BP][DI]。下面两条指令中间我们用的是BP作为基址寄存器。那么当我们使用BP作为基址寄存器的时候,系统默认的情况就是操作数应该在栈段。所以我们计算物理地址的时候应该用段寄存器SS的值,也就是说SS段寄存器的内容乘上16然后再加上相应的基址寄存器和变址寄存器的内容。那么这就是基址变址的寻址方式。
8、相对基址变址寻址
   操作数的有效地址是一个基址寄存器的内容、一个变址寄存器的内容及位移量之和

好最后一种寻址方式就是我们称为相对基址变址寻址。这种寻址方式操作数的有效地址是一个基址寄存器的内容,一个变址寄存器的内容然后再加上一个位移量。所以这种寻址方式使计算操作数的有效地址的时候更加复杂了。那么按照系统默认的状态,计算物理地址的时候,如果说我们使用的是BX基址寄存器的话,那么应该用DS段寄存器的内容来计算物理地址。那么如果说我们使用的是BP作为基址寄存器的话,那么系统默认应该数据在栈段,我们应该使用SS段寄存器的内容来计算物理地址。那么我们可以看到计算物理地址的时候它是基址寄存器然后加上这个变址寄存器再加上一个位移量。同样的这个位移量可以是8位的也可以是16位的。
【例3-1-7】相对基址变址寻址示例
MOV AX,[BX+SI+10]
若(DS)=3000H,(BX)=0010H,(SI)=0002H

好我们来看一个例子。在这条MOV指令MOV AX,[BX+SI+10]中间,源操作数我们用了一个BX基址寄存器,我们用了SI变址寄存器,另外还有一个位移量10。所以当我们计算物理地址的时候,我们就应该用段寄存器DS的值乘上16然后加上BX中间的内容0010再加上SI中间的内容0002好再加上这个位移量10。我们都用16进制表示的话,那么10就是0AH,把这几个数据那么一块儿把它加起来,那么得到的地址就是3001CH。根据这个物理地址我们就可以从指定的存储器中间去取出相应的数据。那么假定现在存储器中间存放的数据是这样的20H、43H,所以这条MOV指令MOV AX,[BX+SI+10]执行以后,那么AX中间的内容就应该是4320H。就是把这个4320H从存储器中间取出来传送到了AX中间。那么这种寻址方式的话相对来说就更加复杂了。8086一共提供了这样的8种的寻址方式。每一种的寻址方式,我们都应该把它很好的掌握。也就是说,首先如果说我们给出一条指令,那么你首先你要搞清楚,这条指令中间给出的这个操作数,到底是属于哪一种寻址方式。因为不同的寻址方式,那么计算地址的有效方法是不一样的。那么取得操作数的方法也就不一样。所以寻址方式应该说是我们学习汇编语言的应该是最基本的概念。也就是说是一个基础。
段默认与段跨越

寻址方式        操作数        段默认        段跨越
直接寻址        [imme]或OA        DS        ES,CS
寄存器间接寻址        [BX],[SI],[DI]
[BP]        DS
SS        ES,CS
DS,ES,CS
基址寻址        [BX+disp]
[BP+disp]        DS
SS        ES,CS
DS,ES,CS
变址寻址        [SI+disp]
[DI+disp]        DS
DS        ES,CS
ES,CS
基址变址寻址        [BX+SI(或(DI))]
[BX+SI(或DI)]        DS
SS        ES,CS
DS,ES,CS
相对基址变址寻址        [BX+DI(或SI)+disp]
[BP+DI(或SI)+disp]        DS
SS        ES,CS
DS,ES,CS
那么我们在刚才介绍寻址方式的时候,大家可以看到,我们提到了一个叫段跨越前缀这样的一个概念。也就是说在一般情况下,我们是按照系统默认的状态到相应的存储器中间去取操作数的。但是在有些情况下我们也可以使用段超越前缀方式,或者叫段跨越前缀的方式来改变这个系统默认状态。那么这儿给出的这个表,就是告诉大家在一般情况的默认的情况下,对应于各种寻址方式,这个数据应该在什么地方。那么我们可以使用段跨越前缀的情况,比如说,假如说我们采用的是直接寻址方式。在直接寻址方式中间,那么这个操作数的话呢,它可以有两种的表示的方式。一种就是一个立即数加了一个方括号,这个在我们前面举的例子中间,我们已经看到了。还有一种就是我们直接的用一个变量名,那实际上就是给的这个变量的地址。那么在直接寻址方式中,我们系统默认的状态应该操作数在数据段中间。所以我们计算物理地址的时候,我们应该用DS寄存器。但是我们也可以使用段跨越前缀,也就是说我们在操作数前面加上ES:冒号,或者CS:冒号,这样的话也就是使的我们的操作数不是按照默认状态,而把操作数改变到了附加段中间,或者是代码段中间。那么每一种寻址方式都是这样来看这个表。比如说我们再举个例子,假如说我们使用的是基址寻址方式。基址寻址方式有两种,一种是使用BX,一种使用BP。比如说我们使用BP,那么操作数按照系统默认的状态,应该是在栈段。所以我们应该计算物理地址的时候我们应该用SS,但是我们可以使用段跨越前缀。使得它改变成DS或者ES或者CS。这样的话也就是说数据它可以在任何一个数据段中间。那么其它的每一种寻址方式我们就不再一一的详细介绍了。大家自己可以阅读一下。
    注意不允许使用段超越前缀的情况
1、        与栈操作有关的指令(PUSH,POP,CALL,RET,INT,IRET)使用SP作为偏移地址指针,只能使用SS作为段寄存器
2、        串操作指令规定用DS:SI来指定源数据区,
用ES:DI来定目的数据区。
段超越前缀只能用于源而不能用于目的,
即SI可更换段寄存器,而DI则只能使用ES
3、        指令只能存放在代码段中
当然这个段超越前缀,也不是说任何情况都可以使用的。所以我们下面提出几点,也就是说不允许使用段超越前缀的情况。那么这个也是希望大家注意的。不允许使用段超越前缀的情况有这样几种情况。第一种情况,当我们使用跟栈操作有关的指令,那么这些指令的话呢就是我们下面会给大家陆续的给大家介绍的。也就是说执行这些指令的时候跟栈有关。在这种情况下,因为栈始终是以SP来指向栈顶的。也就是说SP中间永远存放的是栈顶的地址的偏移量。所以在这种情况下,那么我们只能够使用SS来作为段寄存器。也就是说不能使用段超越前缀了。这是第一种情况。第二种情况,在串操作指令中间,我们后面介绍指令系统的时候,会给大家介绍,有一类指令叫做串操作指令。当我们使用串操作指令的时候,那么有一个规定,我们要用SI来指定源数据区,源数据区我们是放在数据段中间的。同样的我们要用DI来规定目的数据区。而目的数据区是在附加段中间的。那么在这种情况下段超越前缀只能够用于源数据区而不能用于目的数据区。那么这句话的含义也就是说,SI是可以来更换段寄存器的,也就是说我们可以来改变源数据区的它的一个,使用段超越前缀来改变,使得它不是在数据段中间。而对于目的数据区那么它一定是在附加段中间。也就是说DI只能够使用ES,而不能使用段超越前缀来改变。这是第二种情况。第三种情况,指令只能够 放在代码段中间。也就是说我们编写的程序,用汇编语言编写的程序,实际上就是由一条条指令组成的。那么这个指令的话呢只能够放在代码段中间。不能放在其它的段中间。换句话说,那也就是不能够使用段超越前缀。这就是我们提出的几点注意的事项。当然有的我们现在还不太能够体会,这个没关系,我们后面在介绍到有关的内容的时候,我们还会跟大家再来强调这个情况。那么介绍完寻址方式以后,最后的话呢我们简单的给大家介绍一下这个指令的这个格式。这个指令在机器中间是怎么存放的。这部分的内容在我们这本教材中间没有。在参考书中间有。所以大家如果说感兴趣的话可以参考我们指定的这个参考书。
指令格式

1、        操作码的机器语言表示
一般是指令的第一个字节
有两种形式

其中:
  D――――在双操作数指令中有效
           D=1 指定寄存器是目的操作数
           D=0指定寄存器是源操作数
  S――――在立即寻址方式中表示符号扩展:S=1 符号扩展
                                         S=0符号不扩展
  W――――指示操作数字长:W=1 字操作
                            W=0 字节操作
我们知道一条指令它应该包含操作码和操作数这样两个部分。任何一条指令那么它基本的内容就应该有这样两个信息。操作码就表明的是这条指令它应该完成什么样的一个操作。那么操作数的话,那实际上当然是运算对象了。当然各种指令它的这个格式可以有不一样。有的指令可以不需要操作数,比如说停机指令它就不需要操作数。那么也有的指令它需要有两个操作数。象我们前面介绍的MOV指令,那么实际上它包含的是两个操作数。那么我们现在就以最简单的情况,假如说我们包含一个操作码部分,还有包含一个操作数部分来介绍一下。那么这样的一条指令在计算机中间也就是说它是怎么来表示的。首先我们看操作码部分。操作码一般它是在这条指令中间,它用第一个字节来表示。一般一条指令它在计算机中间存放的时候应该占多个字节。当然不同的指令占的字节的数目也是不一样的。那么一条指令它的操作码部分,一般它是指令的第一个字节。一个字节有8位,这8位中间它怎么安排呢,有两种可能。一种情况是这样的,就是说一部分这个OP,我们就表示这个操作码部分,然后D是一位W是一位。第二种形式的话,跟第一种形式有一点区别就是D这一位换成了S。那么我们来看操作码部分的话不用多说了。实际上也就是说这条指令,它的用机器符号来表示的话,也就是说它所对应的二进制代码的形式。那么这个D这一位,它是什么含义呢。D这一位在双操作数指令中间它有一个含义。也就是说如果D等于1,那么它表明这个指令中间指定的这个寄存器应该是个目的操作数。如果D等于0,那么指定的寄存器是个源操作数。也就是说在双操作数指令中间,那么8086它规定,也就是说一定要有一个操作数是一个寄存器。当然如果说某一个操作数,源操作数如果是一个立即寻址方式的话,那是例外。在其它情况下,那么目的操作数、源操作数一定要有一个是寄存器。那么到底哪一个是寄存器呢,它就用这位为D来区分。那么S这一位,S这一位它的含义是这样的,假如说我们源操作数是一个立即寻址方式,它就表示符号扩展。也就是说如果S=1这一位,那么表示符号要扩展。说如果S=0那么符号不进行扩展。大家还记得我们一开始的时候,我们给大家介绍立即寻址方式的时候,我们就举了个例子。-40这个立即数传送到寄存器中间,那么实际上假如说我们这个寄存器用的是AX,也就是说16位的话,那么实际上我们进行的是符号扩展。所以在机器语言表示的时候,实际上S这位就应该用1来表示。表示要对这个立即数进行符号扩展。好那么最低位这个W,它的含义的话就是用来表示是进行字操作还是字节操作。因为在8086中间我们可以,以字为单位来进行操作,也可以字节为单位来进行操作。那么到底是以什么样的方式来操作呢,那么实际上就是用W这一位来区分。这就是操作码部分在指令的第一个字节中间,它各位的含义。那么下面我们再来看寻址方式。
2、        寻址方式的机器语言表示
一般是指令的第2个字节

其中:SEG表示寄存器方式,与W结合确定所用寄存器
SEG        W=1        W=0
000        AX        AL
001        CX        CL
010        DX        DL
011        BX        BL
100        SP        AH
101        BP        CH
110        SI        DH
111        DI        BH
那么寻址方式的话呢,它一般的话呢应该是放在指令的第2个字节中间。这第2个字节的话同样的有8位,我们把这8位的话分成3部分。第一部分MOD用两位来表示。中间SEG用3位来表示。那么最低部分R/M用3位来表示。这每一部分它都有含义。我们先来看中间的这3位SEG。中间的这3位实际上就是表示寄存器方式。也就是说,如果说我们在指令中间采用了寄存器寻址方式的话。那么到底使用的是哪一个寄存器呢。实际上就是用这3位,然后再跟第1个字节中间的W这一位结合起来一块来确定所使用的寄存器。比如说如果说这3位是0,那么W这一位是1的话,那么表明指令中间用的寄存器是AX。假如说W是0的话,那么表明指令中间用的寄存器就是AL。那么这个表的话呢就是给出了就是各种状态,这3位的话可以有8种不同的状态。那么再结合W等于1或者W等于0,使用它一组合一共可以有16种不同的状态。刚好把我们使用的寄存器都把它表示出来了。那么下面我们再来看就是前面两位MOD部分和后面3位R/M部分,到底是表示一个什么含义。那么这两部分结合起来的话呢,它就是用来确定了另外一个操作数的寻址方式。另外一个操作数的寻址方式可以是我们前面讲的各种寻址方式是吧。下面这个表的话呢给出来了。

假如说MOD是00,MOD有两位所以它有4种不同状态00、01、10、11,4种不同状态。那么如果MOD是00,而R/M的话呢它可以有,同样的可以有8种状态。如果R/M也是000,那么它表明的就是一种基址加上变址的寻址方式。基址用的是BX寄存器,而变址用的是SI寄存器。所以实际上这是一种基址加上变址的寻址方式。那么如果MOD是01的话我们可以看到,那也就是说它加上了一个8位的位移量,基址加变址又加上了一个8位的位移量。那么假如说MOD是10的话,实际上它加的是一个16位的位移量。基址加变址加16位的位移量。所以每一行的话就是这样的一个含义。那么当然如果MOD是11的话,那么实际上,也就是说根据W=0还是W=1,实际上它还是一种寄存器的寻址方式。也就是说两个操作数可以都是寄存器寻址方式。那么这个表的话呢,我们就不再一行一行的看了。
1、        MOD=00 无位移量字节的存储器寻址方式
2、        MOD=01 带有一个位移量字节的存储器寻址方式
   
3、        MOD=10 带有两个位移量字节的存储器寻址方式
   
实际上就是我们把它归纳一下的话,也就是说当MOD等于00的话,它表示的是不带位移量的这样一种寻址方式。而MOD等于01的话,那么是一个8位的偏移量。如果MOD等于10的话,那么实际上它带的是一个16位的位移量。从我们刚才第一行举的这个例子中间,我们可以看到了。
段超越前缀的表示
  在指令之前用一个字节表示
   
SEG指定所用段寄存器
SEG        段寄存器
00        ES
01        CS
10        SS
11        DS
好我们再来看一下,假如说我们在这条指令中间我们采用了段超越前缀,那么它又怎么来表示。如果说指令中间采用了段超越前缀,那么它再翻译成机器码以后,那么实际上在这条指令的前面,它应该加上一个字节。那也就是说这条指令的第一个字节应该是这样的一个信息。

SEG        段寄存器
00        ES
01        CS
10        SS
11        DS
前面3位是,高3位应该是001。低3位部分是110。这个是固定的。好中间两位,好中间两位就是表明了你用的是哪一个段寄存器。那么因为两位的话呢,可以有4种不同的状态。所用刚好对应了4个不同的段寄存器。所用假如说你在指令中间使用了一个段超越前缀。好那么我们实际上的话呢就是在指令前面加上了这么一个字节,来表示你使用了哪一个段寄存器来作为段超越前缀。
指令的执行时间
一条指令的执行时间是取指令、取操作数、执行指令和传送结果各阶段所需时间的总和
指令的执行时间与指令、寻址方式有关:
    不同的指令执行时间不同
存、取操作数的时间因不同寻址方式而不同
例:
指令        寻址方式        时钟周期数
传送        寄存器――寄存器        2
整数乘法        16位寄存器乘        128――154
移位        寄存器移1位        2
无条件转移        直接转移        15
条件转移        不转移        4
        转移        16
好最后的话呢我们给大家说明一下,就是这个指令的这个执行时间。那么一条指令它的执行时间,应该是从取指令开始是吧。取指令,然后的话呢它要分析这条指令,它应该完成什么样的操作,然后的话呢应该去取操作数,有了操作数以后,根据指令码来完成相应的操作,也就是说具体的来执行这条指令。好最后把执行的结果送到指定的地方。所以一条指令的执行时间,应该是在各个阶段所需要的时间的总和。那么指令的执行时间它跟什么有关呢,应该说它跟指令有关。这含义也就是说不同的指令我们执行的时间是不一样的。指令的执行时间还跟寻址方式有关。也就是说不同的寻址方式,那么指令的执行时间也是不一样的。这个地方我们给出了一个例子。也就是说不同指令,不同的寻址方式,那么执行这样的指令它所需要的时钟的周期数。那么我们可以看到,假如说是传送指令采用的寻址方式是从某一个寄存器传送到另外一个寄存器,这显然需要的时间比较少是吧。它需要的时钟周期数为2。那么当执行乘法指令的时候,它需要的时间就很多了。乘法指令的话,它需要执行的时间那就比其它指令需要的时间要多得多。当然不同的寻址方式,那么所需要的时间也是不一样的。这个的话我们有一个大概的这么一个概念就行了。因为详细的这部分的讨论,那是在计算机组成原理里面的内容。
当我们根据不同的寻址方式来计算有效地址的时候。那么实际上我们可以看到,不同的寻址方式所需要的时钟周期数也是不一样的。
寻址方式        时钟周期数
直接        6
寄存器间接        5
变址、基址        9
变址基址        7-8
相对变址基址        11-12
那么这个表实际上就是给出了指令的执行时间,跟寻址方式有关的这么一个数据。比如说直接寻址,直接寻址的话需要的时钟周期数是6。而当相对变址基址这种寻址方式的话,需要的时钟周期数就比较多。那么这儿给出的几个寻址方式那都是跟存储器有关的,也就是说操作数在存储器中间,我们需要来访问这个存储器。所以在各种寻址方式中间象寄存器寻址方式,立即寻址方式。那么执行的时候它不需要去访问存储器,操作数马上就能够得到。所以它需要的时间就比较少。这部分的话呢我们简单的给大家做一个这样的介绍。所以寻址方式我们全部都讲完了。那么最后我们给大家留两个思考题。
思考题:
1.        指令MOV ARRSY[DI],DX中目的操作数的寻址方式是                。
A.        变址寻址B.寄存器间接寻址C.基址寻址D.基址变址寻址
这个题目我们问你,在这条MOV ARRSY[DI],DX指令中间,目的操作数的寻址方式是什么。大家注意这条MOV指令MOV ARRSY[DI],DX中间。这是源操作数DX,这是目的作数ARRSY[DI]。它问的是目的操作数的寻址方式。
2.        指令MOV AX,[BP+SI]源操作数的段地址隐含在                   中。
A.        CS  B.SS  C.DS  D.ES
在这条MOV指令MOV AX,[BP+SI]中间,源操作数的段地址应该隐含在哪一个段寄存器中间。那么当然你首先应该知道,这个寻址方式是什么寻址方式。那么它使用的是基址加变址寻址方式。我们使用的基址寄存器是BP。注意了我们使用的是BP,所以按照系统默认的状态操作数应该在什么地方。这样的话这个题目也应该能够回答出来了。
这部分的作业就是3.1,另外我们给出一个补充习题。
补充习题:指出下列指令中源操作数和目的操作数的寻址方式
MOV   ARRAY,BX
ADD   CX,ALPHA[BX] [SI]
AND   GAMMA[DI],11011001B
MOV   AX,[BX]
MOV   ES:[BX],DX
MOV   SI,[SI]
充习题就是指出下列指令中源操作数和目的操作数的寻址方式。我们给出了下面若干条指令,啊那么这儿指令的话呢,我们用到了一条这是ADD   CX,ALPHA[BX] [SI];ADD就是加法指令。这个AND。AND   GAMMA[DI],11011001B;就是逻辑与运算指令。其实这儿的寻址方式跟这个指令码是没有关系的,是吧大家主要是看源操作数和目的操作数,它们的寻址方式是什么。好我们休息一下。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//