C語言內嵌彙編程式設計 函式引數傳遞,返回值

2021-08-21 11:31:18 字數 1405 閱讀 8511

內嵌程式設計:函式體用彙編實現,儲存在.asm檔案中;在.asm和.c檔案中宣告;在.c檔案中呼叫,呼叫方式和普通函式相同。函式引數傳遞剛開始想用偷懶,預設傳入引數較少的函式,引數直接傳入cx、dx,從通用暫存器可以直接得到引數值。而不用堆疊中撈(在efi shell上述方法好像可以,下次試試)。實際上述方法不可行,用debug32檢視通用暫存器值,發現引數並未傳入》_堆疊變化情況,未呼叫函式前:

函式引數傳入堆疊情況:

引數入棧後,將指令指壓入棧儲存;要用到bp暫存器,將bp也壓入堆疊; 

執行到**段,堆疊變化:

//iowritebyte(0x80, 0x13), 向cpu debugio寫入0x13

//value = ioreadbyte(0x80), 從指定io(space)讀取乙個值

_iowritebyte proc

push bp         ; 訪問堆疊指標,段位址預設ss

mov bp, sp      ; ss:sp指向棧頂

mov dx, [bp+4]  ;函式左起起第乙個引數

mov al, [bp+6]  ;

out dx, al

pop bp

ret             ;c語言編譯為彙編後,ss:sp指向入棧前位置

__iowritebyte endp

函式值返回將要需要返回的值寫入ax;需要返回多個值時傳入指標

value = ioreadbyte(0x80); //從指定io(space)讀取乙個值
_ioreadbyte proc

push bp

mov bp, sp

mov dx, [bp+4]

in al, dx

pop bp

ret ;pop ip;sp=sp+2

_ioreadbyte endp

暫時就用到這麼多。若有理解有誤之處,還請各位指出。

C 語言函式引數的傳遞

c 語言函式引數的傳遞 就像c語言眾多的後世子孫一樣,c 的函式引數是非常講究的。首先,引數必須寫在函式名後面的括號裡,這裡我們有必要稱其為形參。引數必須有乙個引數名稱和明確的型別宣告。該引數名稱只在函式體內部可見。因此在該函式體以外的任何地方使用同樣的變數名是不會引起衝突的。每當呼叫函式的時候,必...

c語言 函式引數的傳遞

程式一 值傳遞 include includeusing namespace std void exchg1 int x,int y int main 原因 函式在呼叫時是隱含地把實參a,b的值分別賦值給了x,y,之後在寫的函式體內再也沒有對a,b進行任何操作了。交換只是x,y變數。並不是a,b。當...

linux中c語言常用內嵌彙編

原始碼位址 main2.c allen created by allenboy on 2018 1 20.編譯不過 可以生成.檔案 gcc s main2.cpp gcc version 7.2.0 ubuntu 7.2.0 8ubuntu3 include int a 10 int b 20 in...