使用 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 语法时汇编程序崩溃 [重复]的主要内容,如果未能解决你的问题,请参考以下文章