★◤nitct◢★
武林高手

[] ◤nitct◢求教原理高手...

-->
操作数是指令或程序的主要处理对象。如果某条指令或某个程序不处理任何操作数,那么,该指令或程序不可能有数据处理功能。在CPU的指令系统中,除NOP(空操作指令)、HLT(停机指令)等少数指令之外,大量的指令在执行过程中都会涉及到操作数。所以,在指令中如何表达操作数或操作数所在位置就是正确运用汇编指令的一个重要因素。
在指令中,指定操作数或操作数存放位置的方法称为寻址方式。操作数的各种寻址方式是用汇编语言进行程序设计的基础,也是本课程学习的重点之一。
微机系统有七种基本的寻址方式:立即寻址方式寄存器寻址方式直接寻址方式寄存器间接寻址方式寄存器相对寻址方式基址加变址寻址方式相对基址加变址寻址方式等。其中,后五种寻址方式是确定内存单元有效地址的五种不同的计算方法,用它们可方便地实现对数组元素的访问。
另外,在32位微机系统中,为了扩大对存储单元的寻址能力,增加了一种新的寻址方式——32位地址的寻址方式
为了表达方便,我们用符号“(X)”表示X的值,如:(AX)表示寄存器AX的值。
3.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”存储形式和执行示意图。


图3.1 立即寻址方式的存储和执行示意图寄存器寻址方式

指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
指令中可以引用的寄存器及其符号名称如下:
、8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;
、16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;
、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等。
由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。通常情况下,我们提倡在编写汇编语言程序时,应尽可能地使用寄存器寻址方式,但也不要把它绝对化。 直接寻址方式
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。
例3.1 假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?
解:根据直接寻址方式的寻址规则,把该指令的具体执行过程用图3.2来表示。 从图3.2中,可看出执行该指令要分三部分:

图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, 1234HMOV AX, [1234H];前者是立即寻址,后者是直接寻址
MOV AX, VARWMOV AX, [VARW];两者是等效的,均为直接寻址

寄存器间接寻址方式
操作数在存储器中,操作数的有效地址用SIDIBXBP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。该寻址方式物理地址的计算方法如下:

寄存器间接寻址方式读取存储单元的原理如图3.3所示。

图3.3 读取操作数过程的示意图

在不使用段超越前缀的情况下,有下列规定:
若有效地址用SIDIBX等之一来指定,则其缺省的段寄存器为DS
若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
例3.2 假设有指令:MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么?
解:根据寄存器间接寻址方式的规则,在执行本例指令时,寄存器DI的值不是操作数,而是操作数的地址。该操作数的物理地址应由DSDI的值形成,即:
PA=(DS)*16+DI=1000H*16+2345H=12345H。

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

图3.4 读取操作数过程的示意图

寄存器相对寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BXBP)或变址寄存器(SIDI)的内容和指令中的8位/16位偏移量之和。其有效地址的计算公式如右式所示。
在不使用段超越前缀的情况下,有下列规定:
、若有效地址用SIDIBX等之一来指定,则其缺省的段寄存器为DS
、若有效地址用BP来指定,则其缺省的段寄存器为SS

指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
例3.3 假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?
解:根据寄存器相对寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

图3.5 寄存器相对寻址方式的执行过程示意图

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

该操作数的物理地址应由DSEA的值形成,即:
PA=(DS)*16+EA=1000H*16+2445H=12445H。

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


基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BXBP)和一个变址寄存器(SIDI)的内容之和。其有效地址的计算公式如右式所示。


在不使用段超越前缀的情况下,规定:如果有效地址中含有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

该操作数的物理地址应由DSEA的值形成,即:
PA=(DS)*16+EA=1000H*16+2111H=12111H

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

图3.6 基址加变址寻址方式的执行过程示意图

相对基址加变址寻址方式

操作数在存储器中,其有效地址是一个基址寄存器(BXBP)的值、一个变址寄存器(SIDI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如右式所示。 在不使用段超越前缀的情况下,规定:如果有效地址中含有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

该操作数的物理地址应由DSEA的值形成,即:
PA=(DS)*16+EA=1000H*16+2310H=12310H

所以,该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。其执行过程如图3.7所示。 从相对基址加变址这种寻址方式来看,由于它的可变因素较多,看起来就显得复杂些,但正因为其可变因素多,它的灵活性也就很高。比如:
图3.7 相对基址加变址寻址方式的执行过程示意图



D1来访问一维数组D1的第i个元素,它的寻址有一个自由度,用D2[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]
相对基址加变址寻址方式
32位地址的寻址方式在32位微机系统中,除了支持前面的七种寻址方式外,又提供了一种更灵活、方便,但也更复杂的内存寻址方式,从而使内存地址的寻址范围得到了进一步扩大。
在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BXBP)和变址寄存器(SIDI)来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAXEBXECXEDXESIEDIEBPESP)都可以是地址偏移量的一个组成部分。
当用32位地址偏移量进行寻址时,内存地址的偏移量可分为三部分:一个32位基址寄存器,一个可乘1、2、4或8的32位变址寄存器,一个8位/32位的偏移常量,并且这三部分还可进行任意组合,省去其中之一或之二。
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、基址寄存器是EBPESP时,默认的段寄存器是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

3.9 操作数寻址方式的小结下面控件是学习和理解操作数寻址方式的控件,它把各种寻址方式的变化和限制组合在一起。通过它,读者能更进一步掌握寻址方式的书写格式。指令系统
指令系统是CPU指令的集合,CPU除了具有计算功能的指令外,还有实现其它功能的指令,也有为某种特殊的应用而增设的指令。
通常,把指令按其功能分成以下几大类:

[list]
[*]数据传送指令
[*]标志位操作指令
[*]算术运算指令
[*]逻辑运算指令
[*]移位操作指令
[*]位操作指令比较运算指令
下面,我们逐一介绍每类指令中的指令。

[list]
[*]循环指令
[*]转移指令
[*]条件设置字节指令
[*]字符串操作指令
[*]ASCII-BCD码运算调整指令处理器指令

5.2.1 数据传送指令 数据传送指令又分为:传送指令、交换指令地址传送指令堆栈操作指令转换指令I/O指令等。
除了标志位操作指令SAHFPOPF指令外,本类的其它指令都不影响标志位。
1、传送指令MOV(Move Instruction)
传送指令是使用最频繁的指令,它相对于高级语言里的赋值语句。指令的格式如下:
MOV  Reg/Mem, Reg/Mem/Imm
其中:Reg—Register(寄存器),Mem—Memory(存储器),Imm—Immediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。在本网络课件的网页中,都将采用上述缩写,此后不再说明。
指令的功能是把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。在存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。
下面列举几组正确的指令例子:
源操作数是寄存器
MOV  CH, ALMOV  BP, SPMOV  ECX, EBX
MOV  DS, AXMOV  [BX], CHMOV  [BX+SI], AX
源操作数是存储单元
MOV  AL, [100H]MOV  BX, ES:[DI]MOV  EDX, [BX]
MOV  BX, VARWMOV  AX, [BX+SI]MOV  CH, [BX+DI+100H]
其中:VARW是字类型内存变量(下同)。
源操作数是立即数
MOV  AL, 89HMOV  BX, -100HMOV  EDX, 12345678H
MOV  VARW, 200HMOV  [BX], 2345HMOV  [BX+DI], 1234H

在汇编语言中,主要的数据传送方式如图5.1所示。虽然一条MOV指令能实现其中大多数的数据传送方式,但也存在MOV指令不能实现的传送方式。


图5.1 MOV指令数据传送示意图

对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。
1)、两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOV  BL, AX等是不正确的;
2)、两个操作数不能同时为段寄存器,如:MOV  ES, DS等;
3)、代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV  CS, AX等不正确,但指令MOV  AX, CS等是正确的;
4)、立即数不能直接传给段寄存器,如:MOV  DS, 100H等;
5)、立即数不能作为目的操作数,如:MOV  100H, AX等;
6)、指令指针IP,不能作为MOV指令的操作数;
7)、两个操作数不能同时为存储单元,如:MOV  VARA, VARB等,其中VARA和VARB是同数据类型的内存变量。

对于规定247,我们可以用通用寄存器作为中转来达到最终目的。表5.1列举一个可行的解决方案,尽供参考。读者可考虑用其它办法来完成同样的功能。
表5.1 MOV指令的变通方法
功能描述
不正确的指令
可选的解决方法
把DS的值传送给ES
MOV  ES, DS
MOV  AX, DS
MOV  ES, AX
把100H传给DS
MOV  DS, 100H
MOV  AX, 100H
MOV  DS, AX
把字变量VARB的值传送给字变量VARA
MOV  VARA, VARB
MOV  AX, VARB
MOV  VARA, AX

对于情况1:不同位数数据之间的传送问题,在80386及其以后的CPU中,增加一组新的指令——传送-填充指令,它可把位数少的源操作数传送给位数多的目的操作数,多出的部分按指令的规定进行填充。引用:

快考试了。。。没上好课。。。没办法 不知道有没有计算机原理高手帮我说一下指令系统及控制器  网上能不能找到此类易懂 能快速学会的课件,,,多谢啊。。。

惭愧。。。。。


[ 本帖最后由 ★◤nitct◢★ 于 2007-5-19 15:37 编辑 ]
#1楼
发帖时间:2007-05-19 15:20:08   |   回复数:29
游客组