C語言怎樣嵌入彙編

2021-05-24 23:15:17 字數 2301 閱讀 3748

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.函式呼叫,引數及返回值 具體例子 這篇中有的例子不是很好,比如第五個例子,只用暫存器就可以控制迴圈,不知道為什麼要加上...