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 bpwrite的返回值
ret ;pop IP;sp=sp+2
_IoReadByte endp
暂时就⽤到这么多。若有理解有误之处,还请各位指出。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论