在汇编中经常有这样的指令:
mov eax, [ebp+4]
mov eax, [ebx + ecx*4]
Run Code Online (Sandbox Code Playgroud)
我的问题是:我能用这个小括号做什么?我可以对所有寄存器和立即数进行加法和乘法吗?是否有限制?我也可以使用除法和减法吗?我用谷歌搜索了它,但找不到任何好的参考。
32 位和 64 位模式下地址操作数的一般格式为:
[reg1 + reg2*mult + ofs]
Run Code Online (Sandbox Code Playgroud)
mult必须是 1、2、4、8 之一。ofs是一个立即数,即一个常数数值。它可以是正值,也可以是负值。
并非所有三个部分都必须指定,因此例如[eax]或[ecx*2 + 5]都是有效的。
通常,eip/rip寄存器不能用作寄存器值之一。但在64位模式下,有一种特殊的“RIP相对寻址”模式,可以指定为[rip + ofs].