簡體   English   中英

AT&T語法hello world有效,但intel語法無效

[英]AT&T syntax hello world works but intel syntax does not

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

.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嗎? 如果是這樣,正確的語法是什么?

嘗試mov rsi, offset msg 氣體使用MASM狀語法,其中mov rsi, msg移動的內容msgrsi代替移動地址。 必須使用offset關鍵字來避免此問題。

如果要使用Intel語法編程,我建議您選擇像nasm這樣更好的匯編程序。

您可以使用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

(但在位置相關的可執行文件中mov r32, imm32效率低於mov r32, imm32 ,后者的靜態標簽位於虛擬地址空間的低31位中。)

 ## 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位。 無法將.data中的變量移動到Mac x86 Assembly中進行注冊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM