gpt4 book ai didi

assembly - x86-64 操作数的汇编顺序

转载 作者:行者123 更新时间:2023-12-04 02:52:48 24 4
gpt4 key购买 nike

x86-64 汇编中操作数的顺序是什么?:
指令目的地,来源
或者:
指令源、目的地

我有三本书和两种不同的方法!

最佳答案

这取决于汇编程序的语法。大多数情况下,我们有两种选择:Intel 和 AT&T 语法。

Intel 语法有多种风格,主要是 NASM ( mov dword [symbol_name], 1 ) 和 MASM(包括 GAS 的 .intel_syntax noprefix 模式,许多 GNU 和 Unix 工具可以使用该模式。)参见 https://stackoverflow.com/tags/intel-syntax/info有关差异的详细信息并区分它们。

Intel 语法示例(来自 objdump 反汇编,所以这是 GNU .intel_syntax ,并添加了几个示例):

push   rbp         # comment character can be # (GAS) or ; MASM/NASM
mov rbp,rsp
mov DWORD PTR [rbp-0x4],edi
mov DWORD PTR [rbp-0x8],esi
mov edx,DWORD PTR [rbp-0x4]
mov eax,DWORD PTR [rbp-0x8]
add eax,edx
pop rbp
ret

add dword ptr [rdi], 1 # size specifier mandatory if neither operand is a reg
imul ecx, [rdi + rax*4 + 20], 12345

AT&T 语法只有一种风格 ( https://stackoverflow.com/tags/att/info ):
push   %rbp                 # comment character is always #
mov %rsp,%rbp
mov %edi,-0x4(%rbp)
mov %esi,-0x8(%rbp)
mov -0x4(%rbp),%edx
mov -0x8(%rbp),%eax
add %edx,%eax
pop %rbp
retq

addl $1, (%rdi) # size suffix b/w/l/q used to indicate operand-size if neither operand is a register

# with more than 2 operands, reverse the whole list
imul $12345, 20(%rdi, %rax, 4), %ecx

AT&T 语法是 Unix 系统固有的。通常,反编译器具有控制输出语法类型的标志。例如 objdump-Mintel标志,gdb 有 set disassembly-flavor intel选项。

此外,请查看这个有用的站点,您可以在该站点上快速查看无噪音的汇编器输出 Compiler Explorer

请注意 AT&T 语法对于 x87 非可交换 FP 指令(如 fsub)有一个设计错误。和 fsubr带寄存器操作数:参见手册: https://sourceware.org/binutils/docs/as/i386_002dBugs.html

关于assembly - x86-64 操作数的汇编顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54265108/

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