C语言编程约定,C与汇编程序的约定调用

执行函数前(已经调用)(prologue):

将参数逆序压入堆栈(这样在使用ebp+偏移量来访问参数时,可以不考虑参数的数量,直接用%ebp+8(,%ebp+12...)等访问第1个至第N个参数)

pushl $3 # push the n parameter

pushl $2 # push the secondary parameter

pushl $1 # push the first parameter

call fun #

参数n

.

.

.

参数(3):

参数(2):

参数(1):

返回地址:

执行函数(body):

保存原来的ebp至堆栈中

pushl %ebp

.

参数3:

参数2:

参数1:

返回地址:

%ebp(原)

将现在的ebp赋值为esp

movl %esp,%ebp

参数3:

参数2:

参数1:

返回地址:

%ebp(原)

创建空间(下移esp指针)用于保存局部变量

subl $8,%esp

参数3:

参数2:

参数1:

返回地址:

%ebp(原)

|

|

返回(epilogue):

保存返回值至eax

movl -n(%ebp), %eax

丢弃创建的空间(将esp指针移至现ebp)

movl %ebp, %esp

参数3:

参数2:

参数1:

返回地址:

%ebp

|

|

弹出ebp的旧值装入现在ebp中

popl %ebp

参数3:

参数2:

参数1:

返回地址:

|

|

|

ret指令通过把返回地址从堆栈中弹出到程序计数器,从而从该函数返回

ret

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值