一条指令的寻址方式决定了这个操作如何利用指令中所携带的数据
去寻找真正的操作数据。这里,按最直观的理解分做4大类。
(1)立即寻址:真正的操作数就包含在指令当中。
MOV EAX,1
这条指令的写法就是立即寻址,操作数就是1,指令的含义是把1赋给EAX。
(2)寄存器寻址:操作数据在寄存器内。
MOV EAX,EBX
这条指令的写法就是寄存器寻址,操作数放在EBX内,指令的内含义是把EBX
内的数据赋给EAX。
(3)直接寻址:操作数的地址被直接写在指令内。
MOV EAX,[0x1000]
这条指令的写法就是直接寻址,操作数放在0x1000指向的内存地址内,指令的含义
是把地址为0x1000的数据赋给EAX。
(4)间接寻址:操作数的地址需要经过某种运算才能得到,这种运算可能是从
一个寄存器读取,也可能是把某几个寄存器中的数据相加,等等。
MOV EAX,【EBX】
含义是把EBX里的数据作为一个地址,然后从这个地址得到
数据赋予EAX。
MOV EAX, 【EBX+4】
含义是把EBX里的数据作为一个地址,将这个地址加4后得到新地址,从新地址获取
数据赋给EAX。
MOV EAX, 【EBX+EDX】
含义把EBX里的数据与EDX的数据之和作为地址,从这个
地址获取数据赋给EAX。
MOV EAX,【EBX+ECX*4+4】
含义把EBX里的数据与ECX*4的数据之和作为地址,将这个地址加上4后得到新地址,从
新地址获取数据赋给EAX。
这里ECX*4并非表示CPU在做寻址操作的时候可以同时做乘法,而只是将ECX扩大了4倍,
表示这个数组元素都是32位长整数。
写在[ ] 内的最多只能是3个部分的和,你可以理解为基址、变址和常数偏移。