tips:在編譯過程匯中,彙編**塊是原封不動地送到組合語言編譯階段的。
, o8 q: y3 /# c( s# r" [
一、為什麼會用到彙編?
! n3 m2 ?7 d* 8 l
二、何時使用彙編?
: b, k* q0 b- |
第一種情況是,絕對沒有其他方法可以使用。
( l" d8 t6 m6 v& c% t: e: s
第二種情況出現在某個c語言程式的執行時間必須減少的時候。
三、如何嵌入彙編?
- ~2 i+ ]- ? s( n# o u% e
turbo c :
* i: k$ s! a. w
1.使用預處理程式的偽指令#asm和#endasm,#asm用來開始乙個匯程式設計序塊,而#endasm指令用於該塊的結 束。
: ~' `' a7 w2 w
例: **:mul(a,b)
int a,b;
2.使用asm語句
格式:asm《彙編語句》
**:mul(a,b)
int a,b;
注意:asm行後面沒有分號
+ p5 j/ g/ b* i0 [- y; h7 o
visual c++ :
格式:2 k6 z4 c% r; k7 j( d, y
__asm 彙編指令 [ ; ]
__asm [ ; ]
asm前面是兩條下劃線,後面的方括號內容表示分號可有可無。
7 j0 |5 |% ]( y% i5 p
使用方法:
8 /- t$ [& n& d+ z6 g: l
一條一條地用
**:__asm mov al, 2
__asm mov dx, 0xd007
__asm out dx, al
組成一塊地用
**:__asm
還可以弄成一條
**:__asm mov al, 2 __asm mov dx, 0xd007 __asm out dx, al
msdn裡面的內容:
**:/* power2.c */
#include
int power2( int num, int power );
void main( void )
int power2( int num, int power )
/* return with result in eax */
}
gnu gcc :
1 ~& r' x8 n) ?; z$ }
由於內容比較多,所以簡單說一下,具體都在後面的附件裡。
$ p3 s0 h! }6 a* i" n; j+ o
用到的關鍵字
/ l7 n6 `: ^5 }
「__asm__」 表示後面的**為內嵌彙編,「asm」是「__asm__」的別名。
6 g/ b* k8 h. ]+ c, y# z& a, k
「__volatile__」 表示編譯器不要優化**,後面的指令保留原樣,「volatile」是它的別名。
s括號裡面是彙編指令。
內嵌彙編語法如下:
( w__asm__(
1 y7 y- n* ]8 o' a) c: a8 m5 : r8 ]# x8 b9 w
乙個簡單的彙編模板:
**:int a=10,b;
asm("movl %1, %%eax;
movl %%eax, %0;"
:"=r"(b) /*輸出部*/
:"r"(a) /*輸入部*/
:"%eax" /*毀壞部*/
);
表示c語言裡的「b=a;」。
9 |1 ]1 m2 d. a$ o
裡邊r表示使用任意暫存器,%0、%1表示使用兩個暫存器,一般只能%0~%9共十個運算元,按輸入輸出部變數出現順序進行對映。
' v# c! @3 m! l* r' x
暫存器用兩個百分號,是因為使用了%0%1這些數字使百分號有了特殊意義,所以在運算元出現的暫存器必
須用雙百分表示。
毀壞部裡邊的%eax表示eax暫存器在彙編**塊執行過程中會被改寫,在執行前要保護好,這是提交給編
4 z+ @) j# u7 o$ /6 t( }* z
譯器決定的。
C語言嵌入彙編
概述 linux核心原始碼中,有很多c語言中嵌入了彙編語句,如何理解這些彙編語句,對理解核心有很重要的作用。具有輸入和輸出引數的嵌入式彙編語句的基本格式為 asm 彙編語句 輸出暫存器 輸入暫存器 會被修改的暫存器 除第一行以外,後面帶冒號的行若不使用就都可以省略。彙編語句 是你寫彙編指令的地方 輸...
C嵌入彙編
概述 linux核心原始碼中,有很多c語言中嵌入了彙編語句,如何理解這些彙編語句,對理解核心有很重要的作用。具有輸入和輸出引數的嵌入式彙編語句的基本格式為 asm 彙編語句 輸出暫存器 輸入暫存器 會被修改的暫存器 1 define get seg byte seg,addr 2 這段 定義了乙個嵌...
C 嵌入彙編
1.include include using namespace std int main cout 直接在watch裡面輸入暫存器的名字就可以 如,eax,ax,ah,al 3.函式呼叫,引數及返回值 具體例子 這篇中有的例子不是很好,比如第五個例子,只用暫存器就可以控制迴圈,不知道為什麼要加上...