首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86-64操作数的装配顺序

x86-64操作数的装配顺序
EN

Stack Overflow用户
提问于 2019-01-19 07:48:59
回答 1查看 1.9K关注 0票数 4

在x86-64程序集中操作数的顺序是什么?:指令目的地、源或:指令源、目的地。

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

EN

回答 1

Stack Overflow用户

发布于 2019-01-19 08:00:59

这取决于汇编程序的语法。大多数情况下,我们有两个选择:intel语法和AT&T att语法。查看它们各自的标记wiki、intel语法att

英特尔语法有多种风格,主要有NASM (mov dword [symbol_name], 1)和MASM (包括GAS的.intel_syntax noprefix模式,许多GNU和Unix工具都可以使用)。有关差异和区别的详细信息,请参见Intel语法标记wiki

Intel语法示例(来自objdump -drwC -Mintel反汇编,因此这是GNU .intel_syntax,并添加了两个示例):

代码语言:javascript
复制
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)只有一种风格:

代码语言:javascript
复制
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选项。GCC有-masm=intel,它影响内联asm("" :::)语句的组装方式,以及编译器提供给汇编程序的asm。

另外,请看一下这个有用的站点,您可以在这个站点上快速看到汇编程序输出而没有噪音编译器资源管理器

注意AT&T语法对于x87非交换FP指令有一个设计错误,比如fsub和带有寄存器操作数的fsubr:参见手册:002dBugs.html

相关信息:

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54265108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档