[英]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
移動的內容msg
到rsi
代替移動地址。 必須使用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.