操作数的轮询方式(三)

电脑杂谈  发布时间:2019-09-11 10:02:38  来源:网络整理

魔力esp是什么意思_汇编esp是什么意思_esp系统是什么意思

三、操作数的寻址模式

操作数是指令或程序的主要处理对象。如果某条指令或某个程序不处理任何操作数,那么,该指令或程序不也许有数据处理功能。在CPU的指令系统中,除NOP(空操作指令)、HLT(停机指令)等少数指令之外,大量的指令在执行过程中就会涉及到操作数。所以,在指令中怎样表达操作数或操作数所在位置就是正确利用汇编指令的一个重要原因。

在指令中,指定操作数或操作数存放位置的技巧称为寻址模式。操作数的各种寻址模式是用汇编语言进行程序设计的基础,也是本课程学习的重点之一。

微机系统有七种基本的寻址模式:立即寻址方法、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式等。其中,后五种寻址模式是确认内存单元有效地址的五种不同的计算方式,用他们可便捷地推动对数组元素的访问。

另外,在32位微机系统中,为了扩大对内存单元的寻址能力,增加了一种新的寻址模式——32位地址的寻址方式。

为了表达方便,我们用符号“(X)”表示X的值,如:(AX)表示寄存器AX的值。

1、立即寻址方法

操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址模式也就称为立即数寻址模式。

立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果马上数为16位或32位,那么,它将按“高高低低”的方法进行存储。例如:

MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H

MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H

其中:B1、W1和D1分别是字节、字和双字单元。

以上指令中的第二操作数都是立即数,在汇编语言中,规定:立即数不能作为指令中的第二操作数。该要求与高级语言中“赋值语句的前面不能是常量”的要求相一致。

立即数寻址模式一般用于对通用寄存器或存储单元赋初值。图3.1是指令“MOV AX, 4576H”存储方式和执行。

clip_image002

2、寄存器寻址方式

指令所要的操作数已传输在某寄存器中,或把目标操作数存入寄存器。把在指令中强调所使用寄存器(即:寄存器的助忆符)的轮询方式称为寄存器寻址方式。

指令中可以引用的寄存器以及符号名称如下:

1) 8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;

2) 16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;

3) 32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。

寄存器寻址方式是一种简单便捷的寻址模式,源和目的操作数都可以是寄存器。

(1)源操作数是寄存器寻址方式

如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。

其中:VARD、VARW和VARB是双字,字和字符类型的内存变量。在第4章将会学到如何定义他们。

(2)目的操作数是寄存器寻址方式

如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。

(3)源和目的操作数都是寄存器寻址方式

如:MOV EAX, EBX MOV AX, BX MOV DH, BL等。

由于指令所需的操作数已储存在解释器中,或操作的结果存入寄存器,这样,在指令执行过程中,会增加读/写存储器单元的数量,所以,使用寄存器寻址方式的指令具有较快的执行速率。通常状况下,我们注重在编写汇编语言程序时,应尽可能地使用寄存器寻址方式,但也不要把它绝对化。

3、直接寻址模式

指令所要的操作数存放在存储中,在指令中直接给出该操作数的有效地址,这种译码模式为直接寻址方法。

在一般状况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接产生,但即使使用段超越前缀,那么,操作数可放置在其他段。

魔力esp是什么意思_汇编esp是什么意思_esp系统是什么意思

例3.1 假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是哪个?

解:根据直接寻址模式的寻址规则,把该指令的详细执行过程用图3.2来表示。

clip_image004

从图3.2中,可看出执行该指令要分三部分:

由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;

访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得内存单元的物理地址:21234H;

取单元21234H的值5213H,并按“高高低低”的方法存入寄存器BX中。

所以,在执行该指令后,BX的值就为5213H。

由于数据段的段寄存器默认为DS,如果要选定访问其他段内的数据,可在指令中用段前缀的方法显式地书写起来。

下面指令的目标操作数就是带有段前缀的直接寻址模式。

MOV ES:[1000H], AX

直接寻址模式常用于处理存储单元的数据,其操作数是内存变量的值,该译码模式可在64K字节的段内进行寻址。

注意:立即寻址模式和直接寻址方法的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址一般用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。

试比较以下指令中源操作数的轮询方式(VARW是存储字变量):

MOV AX, 1234H MOV AX, [1234H] ; 前者是立即寻址汇编esp是什么意思,后者是直接寻址

MOV AX, VARW MOV AX, [VARW] ; 两者是等效的,均为直接寻址

4、寄存器间接寻址方式

操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这些寻址模式为寄存器间接寻址方式。该译码模式物理地址的推导方式如下:

clip_image006

寄存器间接寻址方式调用内存单元的机理如图3.3所示。

clip_image008

在不使用段超越前缀的状况下,有以下要求:

1) 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;

2) 若有效地址用BP来选定,则其缺省的段寄存器为SS(即:堆栈段)。

例3.2 假设有指令:MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是哪个?

解:根据寄存器间接寻址方式的规则,在执行本例指令时,寄存器DI的值不是操作数,而是操作数的地址。该操作数的物理地址应由DS和DI的值产生,即:

PA=(DS)*16+DI=1000H*16+2345H=12345H。

所以,该指令的执行效果是:把从物理地址为12345H开始的一个字的值传送给BX。

其执行过程如下图3.4所示。

clip_image010

5、寄存器相对寻址方式

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。其有效地址的推导公式如下式所示。

clip_image012

汇编esp是什么意思_魔力esp是什么意思_esp系统是什么意思

在不使用段超越前缀的状况下,有以下要求:

1) 若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;

2) 若有效地址用BP来选定,则其缺省的段寄存器为SS。

指令中给出的8位/16位偏移量用数组表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址达到0FFFFH,则取其64K的模。

例3.3 假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是哪个?

解:根据寄存器相对寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(SI)+100H=2345H+100H=2445H

该操作数的物理地址应由DS和EA的值产生,即:

PA=(DS)*16+EA=1000H*16+2445H=12445H

所以,该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。

其执行过程如图3.5所示。

clip_image014

6、基址加变址寻址方式

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。其有效地址的推导公式如下式所示。

clip_image016

在不使用段超越前缀的状况下,规定:如果有效地址中带有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。

例3.4 假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是哪个?

解:根据基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(BX)+(SI)=2100H+0011H=2111H

该操作数的物理地址应由DS和EA的值产生,即:

PA=(DS)*16+EA=1000H*16+2111H=12111H

所以,该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。

其执行过程如下图3.6所示。

clip_image018

7、相对基址加变址寻址方式

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的推导公式如下式所示。

clip_image020

在不使用段超越前缀的状况下,规定:如果有效地址中带有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。

指令中给出的8位/16位偏移量用数组表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址达到0FFFFH,则取其64K的模。

例3.5 假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是哪个?

解:根据相对基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H

该操作数的物理地址应由DS和EA的值产生,即:

汇编esp是什么意思_esp系统是什么意思_魔力esp是什么意思

PA=(DS)*16+EA=1000H*16+2310H=12310H

所以,该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。其执行过程如图3.7所示。

clip_image022

从相对基址加变址这种寻址模式来看汇编esp是什么意思,由于它的可变因素增多,看起来就变得复杂些,但正因为其可变因素多,它的灵活性也就很好。比如:

用D1[i]来访问一维数组D1的第i个元素,它的寻址有一个自由度,用D2[i][j]来访问二维数组D2的第i行、第j列的元素,其寻址有二个自由度。多一个可变的量,其寻址模式的灵活度也就相应增加了。

相对基址加变址寻址方式有多种等价的书写形式,下面的书写格式都是正确的,并且其寻址含义也有一致的。

MOV AX, [BX+SI+1000H] MOV AX, 1000H[BX+SI]

MOV AX, 1000H[BX][SI] MOV AX, 1000H[SI][BX]

但书写格式BX [1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[“,”]”之外,该限制对寄存器相对寻址方式的书写也相同起作用。

相对基址加变址寻址方式是以下7种寻址模式中最复杂的一种寻址模式,它可变形为其他种类的存储器寻址模式。表3.1列举出该寻址模式与其他寻址方法之间的变形关系。

表3.1 相对基址加变址寻址方式与其他寻址模式之间的变形关系

源操作数

指令的变形

源操作数的寻址方式

只有偏移量

MOV AX, [100H]

直接寻址方式

只有一个寄存器

MOV AX, [BX] 或 MOV AX, [SI]

寄存器间接寻址方式

有一个寄存器和偏移量

MOV AX, [BX+100H] 或MOV AX, [SI+100H]

寄存器相对寻址方式

有二个寄存器

MOV AX, [BX+SI]

基址加变址寻址方式

有二个寄存器和偏移量

MOV AX, [BX+SI+100H]

相对基址加变址寻址方式

8、32位地址的寻址模式

在32位微机系统中,除了支持上面的七种寻址模式受到了进一步扩大。

在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来成为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。

当用32位地址偏移量进行译码时,内存地址的偏移量可分为三个别:一个32位基址寄存器,一个可乘1、2、4或8的32位变址寄存器,一个8位/32位的偏移常量,并且这三个别还可进行任意组合,省去其中之一或之二。

esp系统是什么意思_魔力esp是什么意思_汇编esp是什么意思

32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;

32位变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。

下面列出几个32位地址寻址指令:

MOV AX, [123456H]

MOV EAX, [EBX]

MOV EBX, [ECX*2]

MOV EBX, [EAX+100H]

MOV EDX, [EAX*4+200H]

MOV EBX, [EAX+EDX*2]

MOV EBX, [EAX+EDX*2+300H]

MOV AX, [ESP]

用32位地址偏移量进行译码的有效地址换算公式推导如右式所示。

由于32位寻址模式能使用所有的通用寄存器,所以,和该有效地址相组合的段寄存器也就有新的要求。具体细则如下:

(1)地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器;

如:[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器;

(2)默认段寄存器的选择取决于基址寄存器;

(3)基址寄存器是EBP或ESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS;

(4)在指令中,如果使用段前缀的方法,那么,显式段寄存器优先。

下面列出几个32位地址译码指令及其存储操作数的段寄存器。

指令的举例

访问内存单元所用的段寄存器

MOV AX, [123456H]

默认段寄存器DS

MOV EAX, [EBX+EBP]

默认段寄存器DS

MOV EBX, [EBP+EBX]

默认段寄存器SS

MOV EBX, [EAX+100H]

默认段寄存器DS

MOV EDX, ES:[EAX*4+200H]

显式段寄存器ES

MOV [ESP+EDX*2], AX

默认段寄存器SS

MOV EBX, GS:[EAX+EDX*2+300H]

显式段寄存器GS

MOV AX, [ESP]

默认段寄存器SS


本文来自电脑杂谈,转载请注明本文网址:
http://xinshanjie.com/a/jisuanjixue/article-122497-1.html

    相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 徐亚平
      徐亚平

      千千加油相信自己你最棒

    热点图片
    拼命载入中...