逗号分隔的括号mov指令在反汇编中是什么意思
What does comma separated bracket mov instruction mean in disassembly
0x7f52379dc42c: mov 0xc(%r12,%r11,8),%r11d
0x7f52379dc431: mov %r11d,0xc(%rsp)
0x7f52379dc436: mov 0xc(%r12,%r10,8),%r14d
0x7f52379dc43b: cmp %r11d,%r14d
我理解 mov %r11d,0xc(%rsp) 表示 *(rsp+0xc) = 0xc
mov 0xc(%r12,%r11,8),%r11d是什么意思?
AT&T x86/x64 助记符中内存操作数(解引用)的一般语法是 offset(base, index, scale)
,与 Intel 语法中的 [base + index * scale + offset]
相同(与你使用的伪 C 语法)。
具体来说,您的第一条指令
mov 0xc(%r12,%r11,8), %r11d
与
相同
mov r11d, DWORD PTR [r12+r11*8+0xc]
在英特尔助记符中,与
大致相同
r11d = *(r12 + r11 * 8 + 0xc)
在伪 C 语法中。
请注意,比例在指令中仅使用 2 位进行编码,并且始终是 2 的幂,因此只允许 1、2、4 和 8 的值。
0x7f52379dc42c: mov 0xc(%r12,%r11,8),%r11d
0x7f52379dc431: mov %r11d,0xc(%rsp)
0x7f52379dc436: mov 0xc(%r12,%r10,8),%r14d
0x7f52379dc43b: cmp %r11d,%r14d
我理解 mov %r11d,0xc(%rsp) 表示 *(rsp+0xc) = 0xc
mov 0xc(%r12,%r11,8),%r11d是什么意思?
AT&T x86/x64 助记符中内存操作数(解引用)的一般语法是 offset(base, index, scale)
,与 Intel 语法中的 [base + index * scale + offset]
相同(与你使用的伪 C 语法)。
具体来说,您的第一条指令
mov 0xc(%r12,%r11,8), %r11d
与
相同mov r11d, DWORD PTR [r12+r11*8+0xc]
在英特尔助记符中,与
大致相同r11d = *(r12 + r11 * 8 + 0xc)
在伪 C 语法中。
请注意,比例在指令中仅使用 2 位进行编码,并且始终是 2 的幂,因此只允许 1、2、4 和 8 的值。