使用英特爾的語法或AT & T是獨立於CPU微架構?我的意思是,編譯器的任務是將代碼翻譯成二進制代碼(如果它是獨立的(如果它是AT或英特爾語法),則可以使用任何語法編寫代碼?是否可以在英特爾語法AMD處理器中編碼ASM代碼?
回答
的語法是獨立於CPU架構。例如。在gcc或g++可以使用任何語法。缺省值是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
的評論我檢查,如果我編譯上面的小代碼程序調用。其實gcc調用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
這裏的兩種風格相互混合...
根據這一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。
每當這些問題出現時,我仍然想知道爲什麼AT&T/Bell的人們覺得需要完全偏離英特爾一直在其文檔中使用的完美適當的語法。 –
@ 500-InternalServerError:是的。 gcc將它用於x86,因爲這個先例已經由較早的x86-Unix工具鏈設置,但IDK爲什麼有人曾經首先發明它。儘管如此,常量和寄存器名稱的裝飾也有一些優點。儘管如此,GNU彙編器可能仍然具有不兼容的'.align' /'.globl'指令與'align' /'global'。 –
- 1. AMD與英特爾處理器,使可執行文件
- 2. 英特爾XDK地理編碼
- 3. 英特爾8086處理器
- 4. 從英特爾彙編語言手動編寫C代碼?
- 5. 英特爾媒體軟件編碼器
- 6. 轉換AT&T語法英特爾語法(ASM)
- 7. 英特爾奔騰彙編器x86彙編代碼生成
- 8. 是否可以使用Visual Studio編寫英特爾彙編?
- 9. ASM - 英特爾AT&T
- 10. 分割的64位英特爾(和非英特爾)處理器
- 11. 是否可以在CUDA內核代碼中處理mxarray?
- 12. 英特爾C++編譯器無法處理深層模板?
- 13. 這個英特爾彙編代碼是什麼意思?
- 14. 鏘和英特爾無法編譯這個CRTP代碼
- 15. 英特爾多處理器文檔
- 16. 英特爾IAPX88處理器,陷阱ISR
- 17. 英特爾處理器(linux)上的線程方面g ++編譯代碼的默認行爲是什麼?
- 18. 英特爾和AMD處理器的PROCESSOR_ARCHITECTURE的奇怪註冊表值
- 19. gcc是否可以不編譯代碼?
- 20. 許可英特爾Fortran編譯器
- 21. 在Visual Studio中調試 - 我可以看到英特爾編譯器庫代碼嗎?
- 22. 芯片組信息 - AMD或英特爾
- 23. 是否可以在MSIL中編碼?
- 24. 是否可以強制JIT編譯程序集並獲取asm代碼?
- 25. 編譯器是否只編譯可以執行的代碼?
- 26. Fortran 95編譯器是否可以編譯Fortran 77代碼?
- 27. 是否可以使用其他語言編寫java代碼?
- 28. 英特爾C++編譯器,可以在OS X不開STDARG.H
- 29. Swagger代碼Gen SDK是否可以處理OAuth令牌刷新?
- 30. NASM(英特爾)ASM上彈出
是的,一個是另一個的很大程度上的克隆,這樣你就可以對一個做什麼,你可以爲其他事情。 –
處理器不執行程序集,它們執行機器代碼。語法取決於* only *在您使用的彙編程序上。 –
相關:http://stackoverflow.com/questions/8549427/nasm-versus-att-syntax-what-are-the-advantages – Matt