如何确定寄存器是从右向左加载还是从右向加载

时间:2017-06-21 19:39:35

标签: assembly x86 cpu-registers att intel-syntax

在查看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.

如何确定值是从左向右处理还是从右处理?

1 个答案:

答案 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, srcDWORDQWORD)到相关的操作数,而AT&amp; T语法会附加后缀(BYTElq等)到指令助记符本身。