【发布时间】: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 -_-