寻址方式一般有如下七种:
1.立即寻址
立即(Immediate)寻址,就是在指令中使用的操作数是常数,这个常数就包含在指令中。以下几条指令都是立即寻址的例子:
MOV AL,0
MOV AX,190
MOV EAX,-1
MOV EAX,0FFFFFFFFH
这些指令码中,都包含了立即数,如0,190,-1,0FFFFFFFFH。
2.寄存器寻址
寄存器(Register)寻址方式的操作数在CPU内部的寄存器中。使用寄存器寻址,CPU不用访问内存就可以取得或修改操作数。
MOV BL,80 //目标操作数BL是寄存器寻址
MOV EAX,EBX //源操作数EBX和目标操作数EAX都是寄存器寻址
3.直接寻址(CPU寻找内存中的操作数)
除了立即寻址和寄存器寻址方式外,其他的几种寻址方式的操作数都在内存单元中,寻址方式要说明的是CPU如何确定内存操 作数的地址,然后CPU再对该内存单元中的操作数进行处理。
直接寻址(Direct)寻址就是指令中直接给出了操作数的地址。指令中使用变量时,就是直接寻址。
MOV EAX,dVal
MOV dVal,EBX
MOV EAX,[4000H] //直接给出内存所在地址
在翻译成机器指令后,变量是用它的地址而不是它的名字来表示的。地址外面加一对方括号,表示取这个地址中的内容。
00401010 A1 11 40 40 00 MOV EAX,[00404011]
00401015 89 1D 11 40 40 00 MOV [00404011],EBX
CPU在执行指令的时候,可以直接从指令码中取出地址,而不必经过计算或其他操作,所以叫做直接寻址。
4.寄存器间接寻址
采用寄存器间接(Indirect)寻址方式的操作数的地址放在寄存器中。
MOV ESI,00404011H //将内存地址保存到寄存器中
MOV EAX,[ESI]
注意,MOV EAX,ESI和MOV EAX,[ESI]的区别。
在8086/8088/80286等16位的CPU中,只有4个寄存器能用做寄