C語言內嵌彙編程式設計--函式引數傳遞,返回值
阿新 • • 發佈:2019-02-15
本文內容較為基礎,適合彙編新手(慚愧,本人就是)學習參考。
內嵌程式設計:函式體用匯編實現,儲存在.asm檔案中;在.asm和.c檔案中宣告;在.c檔案中呼叫,呼叫方式和普通函式相同。
函式引數傳遞
剛開始想用偷懶,預設傳入引數較少的函式,引數直接傳入cx、dx,從通用暫存器可以直接得到引數值。而不用堆疊中撈(在Efi shell上述方法好像可以,下次試試)。實際上述方法不可行,用debug32檢視通用暫存器值,發現引數並未傳入>_<。所以需要用棧傳遞引數(以訪問intel cpu IO 為例):
堆疊變化情況,未呼叫函式前:
函式引數傳入堆疊情況:
引數入棧後,將指令指壓入棧儲存;要用到bp暫存器,將bp也壓入堆疊;
執行到程式碼段,堆疊變化:
public _IoWriteByte public _IoReadByte //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
暫時就用到這麼多。若有理解有誤之處,還請各位指出。