內嵌程式設計:函式體用彙編實現,儲存在.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...