gpt4 book ai didi

assembly - 如何确定寄存器是从右到左加载,反之亦然

转载 作者:行者123 更新时间:2023-12-03 18:32:42 25 4
gpt4 key购买 nike

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

如何确定值是从左到右处理还是相反?

最佳答案

通常,Gnu 工具使用 AT&T 语法。你可以通过一些小符号来判断它是 AT&T 语法,比如 $前面的文字,以及 %前面的寄存器。例如,这个指令:

sub    $16, %rax
显然是使用 AT&T 语法。它从 rax 中的值中减去 16注册,并将结果存储回 rax .
在 AT&T 语法中,目标操作数在右侧:
insn   source, destination     # AT&T syntax
还有英特尔语法。这在 Windows 平台上无处不在,通常也可用作 Gnu/Linux 工具的选项。英特尔语法是朴素的——例如:
sub   rax, 16
这与上面的 AT&T 指令相同——它从 rax 中的值中减去 16注册,并将结果存储回 rax登记。
在 Intel 语法中,目标操作数始终在左侧:
insn  destination, source     ; Intel syntax
要绝对确定您使用的是哪个版本,您需要检查反汇编器/调试器的设置并查看它配置使用的语法,但通常只需查看一下就可以一目了然地判断看看是否有象征性的装饰(AT&T 语法的死赠品)。

Summary:

  • If the registers have a % prefix → AT&T syntax → src, dst order.
  • Otherwise, unadorned registers → Intel syntax → dst, src order.

如果您以某种方式最终查看了不使用任何寄存器的代码 (???),另一个很好的启发式线索是 Intel 语法将预先设置大小说明符(如 DWORDQWORDBYTE )到关联的操作数,而 AT&T 语法会向指令助记符本身附加一个后缀( lqb 等)。

关于assembly - 如何确定寄存器是从右到左加载,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44684936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com