操作数是指令或程序的主要处理对象。如果某条指令或某个程序不处理任何操作数,那么,该指令或程序不可能有数据处理功能。在CPU的指令系统中,除NOP(空指令)、HLT(停机指令)等少数指令之外,大量的指令在执行过程中都会涉及到操作数。所以,在指令中如何表达操作数或操作数所在位置就是正确运用汇编指令的一个重要因素。
1,立即寻址方式
MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H
MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H
立即数寻址方式通常用于对通用寄存器或内存单元赋初值
2,寄存器寻址方式
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。
1、源操作数是寄存器寻址方式
如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。
2、目的操作数是寄存器寻址方式
如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。
3、源和目的操作数都是寄存器寻址方式
如:MOV EAX, EBX MOV AX, BX MOV DH, BL等。
3,直接寻址方式
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
MOV BX, [1234H]
假设,(DS)=2000H,内存单元21234H的值为5213H。指令执行后,BX的值是5213H
下面指令的目标操作数就是带有段前缀的直接寻址方式
MOV ES:[1000H], AX
直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进行寻址。
注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。
试比较下列指令中源操作数的寻址方式(VARW是内存字变量):
MOV AX, 1234H | MOV AX, [1234H] | ;前者是立即寻址,后者是直接寻址 | |
MOV AX, VARW | MOV AX, [VARW] | ;两者是等效的,均为直接寻址 |
4,寄存器间接寻址方式
操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。
若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
假设有指令:MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。执行指令后,BX的值是4354H
解:根据寄存器间接寻址方式的规则,在执行本例指令时,寄存器DI的值不是操作数,而是操作数的地址。该操作数的物理地址应由DS和DI的值形成 即: PA=(DS)*16+DI=1000H*16+2345H=12345H。 所以,该指令的执行效果是:把从物理地址为12345H开始的一个字的值传送给BX。 |
5,寄存器相对寻址方式
若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS
若有效地址用BP来指定,则其缺省的段寄存器为SS。
假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,该指令执行后,BX的值是2715H
源操作数的有效地址EA为: |
|
EA=(SI)+100H=2345H+100H=2445H | |
该操作数的物理地址应由DS和EA的值形成,即: | |
PA=(DS)*16+EA=1000H*16+2445H=12445H。 |
6,基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。
规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。
假设指令: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。 |
7,相对基址加变址寻址方式
规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。
指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。
假设指令: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的值形成 即:PA=(DS)*16+EA=1000H*16+2310H=12310H
|
用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]
8,32位地址的寻址方式
32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;
32位变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。
1、地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器;
如:[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器;
2、默认段寄存器的选用取决于基址寄存器;
3、基址寄存器是EBP或ESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS;
4、在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。
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 |