2016-02-17 41 views
0

使用英特爾的語法或AT & T是獨立於CPU微架構?我的意思是,編譯器的任務是將代碼翻譯成二進制代碼(如果它是獨立的(如果它是AT或英特爾語法),則可以使用任何語法編寫代碼?是否可以在英特爾語法AMD處理器中編碼ASM代碼?

+0

是的,一個是另一個的很大程度上的克隆,這樣你就可以對一個做什麼,你可以爲其他事情。 –

+3

處理器不執行程序集,它們執行機器代碼。語法取決於* only *在您使用的彙編程序上。 –

+0

相關:http://stackoverflow.com/questions/8549427/nasm-versus-att-syntax-what-are-the-advantages – Matt

回答

2

的語法是獨立於CPU架構。例如。在可以使用任何語法。缺省值是AT格式,但將".intel_syntax"添加到內聯彙編中可以使用intel語法。

實施例代碼

int main()  { 
    __asm__ __volatile__ (
    ".intel_syntax noprefix\n" 
    "jmp farlabel\n" 
    "mov EAX,EAX\n" 
    "farlabel:\n" 
    "mov EAX,EAX\n" 
    ".att_syntax prefix\n" 
); 
    return 0; 
} 

source

附註noprefix意味着不需要%寄存器的名稱前添加。 .att_syntax切換回AT & T語法,因爲生成的彙編代碼的其餘部分處於此樣式。

基於black的評論我檢查,如果我編譯上面的小代碼程序調用。其實調用cc1plus它生成.s文件(這是彙編代碼),然後調用as它生成.o(對象)文件,然後調用collect2(我認爲這增加了動態加載器和其他機器周圍的用戶代碼),然後cals ld將代碼鏈接在一起並創建可執行文件。

如果gcc -S x.cc被稱爲然後彙編代碼生成後立即停止,所以臨時文件就可以看出。下面是生成的代碼:

 .file "x.cc" 
     .text 
     .globl* main 
     .type main, @function 
main:   
.LFB0:   
     .cfi_startproc 
     pushl %ebp 
     .cfi_def_cfa_offset 8 
     .cfi_offset 5, -8 
     movl %esp, %ebp 
     .cfi_def_cfa_register 5 
#APP   
# 9 "x.cc" 1 
     .intel_syntax noprefix 
jmp farlabel  
mov EAX,EAX 
farlabel:   
mov EAX,EAX 
.att_syntax prefix 

# 0 "" 2 
#NO_APP   
     movl $0, %eax 
     popl %ebp 
     .cfi_restore 5 
     .cfi_def_cfa 4, 4 
     ret 
     .cfi_endproc 
.LFE0:   
     .size main, .-main 
     .ident "GCC: (Debian 4.7.2-5) 4.7.2" 
     .section  .note.GNU-stack,"",@progbits 

這裏的兩種風格相互混合...

+0

嘛GCC不是一個彙編程序,所以它沒有多大意義,認爲它這樣;內聯asm傳遞給'as'。 GCC只關心使用的約束和註冊。 – edmz

+0

@black你是對的!這只是一個例子,彙編代碼的風格在架構上是獨立的。其實我並沒有在Intel平臺上使用'as',但是我使用[tag:gcc]和[tag:g ++]。 – TrueY

1

根據這一link,有彙編語法的兩個主要分支。

x86 assembly language has two main syntax branches: Intel syntax, originally used for documentation of the x86 platform, and AT&T syntax. 1 Intel syntax is dominant in the MS-DOS and Windows world, and AT&T syntax is dominant in the Unix world, since Unix was created at AT&T Bell Labs.[2]

可以用來編寫基於x86的CPU的彙編程序。彙編程序將採用該語法並將其轉換爲操作系統可以加載並且可以執行的二進制格式。

所以,至少在理論上,寫在任何語法兩個程序應該編譯成完全相同的二進制代碼提供的彙編程序可以瞭解所提供的語法。

您使用哪種格式取決於你的彙編程序支持什麼。只是爲了進一步混淆事物,還有其他一些變體,比如流行的nasm。

+3

每當這些問題出現時,我仍然想知道爲什麼AT&T/Bell的人們覺得需要完全偏離英特爾一直在其文檔中使用的完美適當的語法。 –

+0

@ 500-InternalServerError:是的。 gcc將它用於x86,因爲這個先例已經由較早的x86-Unix工具鏈設置,但IDK爲什麼有人曾經首先發明它。儘管如此,常量和寄存器名稱的裝飾也有一些優點。儘管如此,GNU彙編器可能仍然具有不兼容的'.align' /'.globl'指令與'align' /'global'。 –

相關問題