在查看gdb输出并查看汇编调用时,通常我可以找到一个使用硬编码值的命令来确定寄存器是从右到左加载,反之亦然。
通常类似于以下内容:
sub rsp, 16
或
sub 16, rsp
但有时候,没有上面的值可见。 我所看到的就是如下所示的电话:
(gdb) disassemble
Dump of assembler code for function main:
0x0000000100000f54 <main+4>: mov $rdi,%r15
0x0000000100000f59 <main+9>: mov $rsi,%r14
0x0000000100000f60 <main+16>: mov $rdx,%r13
0x0000000100000f67 <main+23>: mov $ecx,$r12d
End of assembler dump.
如何确定值是从左向右处理还是从右处理?
答案 0 :(得分:7)
通常,Gnu工具使用AT&amp; T语法。你可以通过小符号的存在来判断它是AT&amp; T语法,例如popUpAjaxCart
前面的文字和$
前面的寄存器。例如,这条指令:
%
显然使用AT&amp; T语法。它从sub $16, %rax
寄存器中的值中减去16,并将结果存储回rax
。
在AT&amp; T语法中,目标操作数位于右侧:
rax
还有英特尔语法。这在Windows平台上无处不在,通常也可作为Gnu / Linux工具的选项。英特尔语法 unadorned - 例如:
insn source, destination # AT&T syntax
与上面的AT&amp; T指令相同 - 它从sub rax, 16
寄存器中的值中减去16,并将结果存储回rax
寄存器。
在Intel语法中,目标操作数始终位于 left :
rax
要确定您拥有哪个版本,您需要检查反汇编程序/调试程序的设置并查看其配置使用的语法,但它通常已经死了 - 只需通过查看符号装饰是否存在就可以一眼就看出来(AT&amp; T语法已经过时了)。
<强>要点:强>
- 如果寄存器具有
insn destination, source ; Intel syntax
前缀→AT&amp; T语法→%
订单。- 否则,简单的寄存器→英特尔语法→
src, dst
命令。
如果你以某种方式最终看到没有使用任何寄存器(???)的代码,另一个好的启发式线索是英特尔语法将预先设置大小说明符(如dst, src
, DWORD
和QWORD
)到相关的操作数,而AT&amp; T语法会附加后缀(BYTE
,l
,q
等)到指令助记符本身。