AT&T 语法 hello world 有效,但 intel 语法无效

Win*_*don 1 assembly x86-64 gnu-assembler intel-syntax

我正在使用 GAS 汇编器为 linux x86_64 编写一个 hello world 程序,这是我的 AT&T 语法代码。

#.intel_syntax noprefix

.section .data
    msg:
        .ascii "hello world\n"
.section .text
.globl _start
_start:
    movq  $1, %rax
    movq  $1, %rdi
    movq  $msg, %rsi
    movq  $12, %rdx
    syscall

    movq  $60, %rax
    movq  $0, %rdi
    syscall
Run Code Online (Sandbox Code Playgroud)

这有效并打印“hello world”。这是英特尔语法:

.intel_syntax noprefix

.section .data
    msg:
        .ascii "hello world\n"
.section .text
.globl _start
_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, 12
    syscall

    mov rax, 60
    mov rdi, 0
    syscall
Run Code Online (Sandbox Code Playgroud)

这编译并运行良好,但不打印“hello world”。我假设错误在mov rsi, msg? 如果是这样,正确的语法是什么?

fuz*_*fuz 6

试试mov rsi, offset msg。gas 使用类似 masm 的语法,其中mov rsi, msg移动msgto的内容rsi而不是移动地址。该offset关键字必须使用以避免此问题。

如果你想用 Intel 语法编程,我建议你选择一个更好的汇编器,比如 nasm。