1. 程式人生 > >C語言內嵌彙編程式設計--函式引數傳遞,返回值

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

本文內容較為基礎,適合彙編新手(慚愧,本人就是)學習參考。

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

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