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
- 64位內聯彙編
- Get Started with EC2
- C++內嵌彙編 教程1C++
- Solidity之旅(十八)內聯彙編 [inline assembly]Solidinline
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- buuctf-pwn-get_started_3dsctf_20163D
- Get Started:Mac下搭建PHP開發環境MacPHP開發環境
- gcc 和 g++ 的聯絡和區別,使用 gcc 編譯 c++GC編譯C++
- [轉帖]Get started with JDK Flight Recorder in OpenJDK 8uJDK
- C 語言宏 + 內聯彙編實現 MIPS 系統呼叫
- 內聯彙編很可怕嗎?看完這篇文章,終結它!
- C與彙編(NASM) (1)ASM
- gcc編譯階段列印巨集定義的內容GC編譯
- 【自用】彙編初學筆記 #1筆記
- Linux中gcc編譯工具LinuxGC編譯
- C指標原理(7)-C內嵌彙編指標
- C指標原理(8)-C內嵌彙編指標
- C指標原理(6)-C內嵌彙編指標
- 探索gcc編譯最佳化細節 編譯器最佳化gcc -o3GC編譯
- 09. C語言內嵌彙編程式碼C語言
- 彙編
- 編譯器優化:方法內聯編譯優化
- GCC編譯和連結過程GC編譯
- GCC編譯器背後的故事GC編譯
- nasm彙編ASM
- 彙編命令A
- 記錄一次gcc的編譯GC編譯
- 編寫第一個GET、POST介面[renren-fast框架系列(1)]AST框架
- 32位支援:使用 GCC 交叉編譯GC編譯
- 記一次編譯GCC的經歷編譯GC
- 【Python for Everybody(Getting Started with Python)】Week 4 | Review:Chapter 2 題目彙總及個人答案PythonViewAPT
- flutter packages get - pub get failed (1)解決方案FlutterPackageAI
- 彙編基礎
- 初識彙編
- linux彙編指令Linux
- 手撕彙編。。。
- ARM彙編指令集彙總
- iOS逆向之旅(基礎篇) — 彙編(一)— 彙編基礎iOS