GCC內聯彙編(1)Get started
GCC內聯彙編(1)Get started
- 作者:柳大·Poechant(鍾超)
- 郵箱:zhongchao.ustc#gmail.com(# -> @)
- 部落格:Blog.CSDN.net/Poechant
- 日期:July 7th, 2012
1. Intel vs. AT&T
其實並不是要說 Intel 和 AT&T PK 的故事,哈哈。因為首先要熟悉 Intel syntax 的彙編指令寫法和 AT&T syntax 彙編指令的寫法,所以看下錶:
+------------------------------+------------------------------------+
| Intel Code | AT&T Code |
+------------------------------+------------------------------------+
| mov eax,1 | movl $1,%eax |
| mov ebx,0ffh | movl $0xff,%ebx |
| int 80h | int $0x80 |
| mov ebx, eax | movl %eax, %ebx |
| mov eax,[ecx] | movl (%ecx),%eax |
| mov eax,[ebx+3] | movl 3(%ebx),%eax |
| mov eax,[ebx+20h] | movl 0x20(%ebx),%eax |
| add eax,[ebx+ecx*2h] | addl (%ebx,%ecx,0x2),%eax |
| lea eax,[ebx+ecx] | leal (%ebx,%ecx),%eax |
| sub eax,[ebx+ecx*4h-20h] | subl -0x20(%ebx,%ecx,0x4),%eax |
+------------------------------+------------------------------------+
2. 示例
看一個用內聯彙編寫的例子,計算兩數的和:
#include <stdio.h>
int main(void) {
int foo = 10, bar = 15;
__asm__ __volatile__ (
"addl %%ebx, %%eax"
:"=a"(foo)
:"a"(foo), "b"(bar)
:"%eax"
);
printf("foo + bar = %d\n", foo);
return 0;
}
該程式作如下解釋:
-
__asm__
用於表示這是一個內聯彙編程式碼段; - 如果使用了
__volatile
修飾符,則這段內聯彙編程式碼不會被編譯器優化掉,但是如果只是做簡單的計算,不會產生任何可能的 side effects,則最好不要加這個修飾符,這樣可以使編譯器幫助我們優化程式碼; -
"=a"(foo)"
表示這段內聯彙編程式碼執行結束後,輸出結果放在暫存器%eax
中,然後%eax
中的內容再放到foo
C變數中; -
"a"(foo)
表示這段內聯彙編程式碼開始執行時,foo
C變數輸入到%eax
暫存器中,多個輸入值可以用上面示例中的方式表達。 - 以冒號開始的那兩行,其實都是“約束”,這個是
constraint
的直譯,其實你可以理解為邊界條件,即輸入輸出條件。 - 最後一個冒號開始的行,是告訴編譯器,哪些暫存器的值會在內聯彙編程式碼的執行過程中被篡改,因此不要使用這些暫存器去儲存值。這裡就是
%eax
的值會被篡改的意思。
3. 暫存器縮寫
+---+--------------------+
| r | Register(s) |
+---+--------------------+
| a | %eax, %ax, %al |
| b | %ebx, %bx, %bl |
| c | %ecx, %cx, %cl |
| d | %edx, %dx, %dl |
| S | %esi, %si |
| D | %edi, %di |
+---+--------------------+
Reference
- http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
-
轉載請註明來自柳大的CSDN部落格:Blog.CSDN.net/Poechant
-
相關文章
- GCC 內聯彙編GC
- GCC內聯彙編(2)GCC生成彙編程式碼簡單例項GC單例
- Objective-C Primer(1)Get started!Object
- Get Started with EC2
- C++內嵌彙編 教程1C++
- 在Visual C++中使用內聯彙編C++
- FastDFS的配置、部署與API使用解讀(1)Get Started with FastDFSASTAPI
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- Solidity之旅(十八)內聯彙編 [inline assembly]Solidinline
- 在Visual C++中使用內聯彙編 (轉)C++
- 在Visual C++中使用內聯彙編(轉)C++
- Linux 中 x86 的內聯彙編(轉)Linux
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- gcc 和 g++ 的聯絡和區別,使用 gcc 編譯 c++GC編譯C++
- gcc 從語言編譯全過程 預處理---->編譯---->彙編----->連結GC編譯
- Get Started:Mac下搭建PHP開發環境MacPHP開發環境
- C 語言宏 + 內聯彙編實現 MIPS 系統呼叫
- gcc編譯GC編譯
- GNU 編譯器家族 GCC 內部探密(轉)編譯GC
- GCC使用基本方法彙總GC
- buuctf-pwn-get_started_3dsctf_20163D
- gcc編譯階段列印巨集定義的內容GC編譯
- C與彙編(NASM) (1)ASM
- [轉帖]Get started with JDK Flight Recorder in OpenJDK 8uJDK
- GCC編譯選項GC編譯
- GCC 編譯選項GC編譯
- 【自用】彙編初學筆記 #1筆記
- 使用DbgHelp獲取函式呼叫堆疊之inline assembly(內聯彙編)法函式inline
- GCC/G++學習筆記 - 1 - 執行預編譯GC筆記編譯
- C指標原理(8)-C內嵌彙編指標
- C指標原理(6)-C內嵌彙編指標
- C指標原理(7)-C內嵌彙編指標
- 我的彙編學習之路(1):指令
- 編譯器優化:方法內聯編譯優化
- gcc編譯cpp檔案GC編譯
- GCC編譯器的使用GC編譯
- 開源編譯器 GCC 跨越 5.0,釋出 GCC 5.1編譯GC
- GCC 使用指南及gcc最佳編譯引數(轉)GC編譯