【问题标题】:AT&T syntax hello world works but intel syntax does notAT&T 语法 hello world 有效,但 intel 语法无效
【发布时间】:2018-07-26 16:45:32
【问题描述】:

我正在使用 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

这可以工作并打印“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

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

【问题讨论】:

    标签: assembly x86-64 gnu-assembler intel-syntax


    【解决方案1】:

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

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

    【讨论】:

    • @WingerSendon 请注意,您需要返回原始代码并修复一些指令以使其在 nasm 上组装,但总体而言,该语法比 Intel 语法中的 gcc 更明智。
    【解决方案2】:

    您可以使用 AT&T 语法反汇编程序(如 objdump -d)来查看 GAS 中的 mov rsi, msg .intel_syntax 汇编为 mov msg, %rsi,即来自 32 位绝对地址的 64 位加载。

    或使用objdump -d -Mintel 查看适用于您工作版本的 Intel 语法反汇编。

    GDB 有 set disassembly-flavor intel 或 att,因此您甚至可以在一个调试会话中翻转。


    顺便说一句,您应该使用相对于 RIP 的 LEA 将 64 位静态地址放入寄存器。比mov r64, imm64效率更高

    lea   msg(%rip), %rsi    # AT&T
    
    lea   rsi, [msg + rip]  # GAS .intel_syntax
    
    lea   rsi, [rel msg]     ; NASM
    

    (但在静态标签位于虚拟地址空间的低 31 位的位置相关可执行文件中,效率低于 mov r32, imm32。)

     ## In x86-64 position-dependent executables on Linux
    
     mov  $msg, %esi            # AT&T
    
     mov   esi, OFFSET msg      # GAS .intel_syntax
    
     mov   esi, msg          ; NASM
    

    请注意,OS X 将静态地址放在低 32 位之外,因此即使在可执行文件中,您的地址也是 64 位的。 Unable to move variables in .data to registers with Mac x86 Assembly

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 2019-07-31
      相关资源
      最近更新 更多