使用 AT&T 语法时汇编程序崩溃 [重复]

Posted

技术标签:

【中文标题】使用 AT&T 语法时汇编程序崩溃 [重复]【英文标题】:Assembly program crashes when using AT&T syntax [duplicate] 【发布时间】:2018-10-11 18:46:34 【问题描述】:

我最近开始使用 NASM 进行汇编编程,如有任何错误请见谅。无论如何,我一直在尝试编译两个非常简单的程序,它们做完全相同的事情(或应该做的事情),一个使用 Intel 语法,另一个使用 AT&T 语法。当我使用英特尔语法对其进行编码时,该程序似乎工作正常。但是,当我尝试使用 AT&T 语法对其进行编码时,程序会在运行时崩溃,因为我认为是分段错误或其他原因。显然它和它的英特尔同行做的事情不同,所以如果有人能指出我的代码有什么问题,那就太好了

顺便说一句:我正在 64 位 Windows 10 上进行编程,但我认为这不会很有用,因为程序本身几乎什么都不做......

这是我的代码:

英特尔语法:

.intel_syntax noprefix

.global main

main:
    push rbp
    mov rbp, rsp

    mov rax, QWORD PTR [rbp + 0x8]
    mov rbx, QWORD PTR [rbp + 0xc]
    mov rax, rbx

    mov rsp, rbp
    pop rbp
    ret

AT&T 语法(程序崩溃):

.global main

main:
    pushq %rbp
    movq %rbp, %rsp

    movq %rax, 0x8(%rbp)
    movq %rbx, 0xc(%rbp)
    movq %rax, %rbx

    movq %rsp, %rbp
    popq %rbp 
    ret

【问题讨论】:

at&t 的操作数顺序颠倒了。您需要交换所有操作数。 PS:虽然这两个版本都不是nasm。这更像是gas 是的,我在您发布它时就记住了这一点,现在它可以工作了。谢谢大声笑。 NASM 我的意思是我用 NASM 编译它,你的意思是这两个版本都不是 NASM? @Jester,对不起,我的错误。显然我的文本编辑器没有使用我使用 NASM 编译的构建系统,所以它使用了 gas -_- 【参考方案1】:

Intel and AT&T syntax

是的,我刚刚意识到 AT&T 操作数的顺序是颠倒的,所以我在这里回答我自己的问题,也许这只是您应该阅读文档和指南

的一个例子

修复:

.global main

main:
    pushq %rbp
    movq %rsp, %rbp

    movq 0x8(%rbp), %rax
    movq 0xc(%rbp), %rbx
    movq %rbx, %rax

    movq %rbp, %rsp
    popq %rbp 
    ret

【讨论】:

以上是关于使用 AT&T 语法时汇编程序崩溃 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

需要一个很好的 AT&T 汇编语法来源

AT&T汇编语法与x86语法基本区别

x86 AT&T 语法程序集的注释语法

关于 AT&T 汇编语法 (%esp,1)

与 AT&T 相比,英特尔汇编语法的局限性 [关闭]

Linux下AT&T汇编语法格式与Intel汇编语法格式异同