汇编-------函数传参的实现原理

本文详细介绍了在16位和32位系统中函数调用的过程,包括参数传递的方式和堆栈操作的具体实现。通过具体的汇编代码示例,展示了不同位数系统中调用函数时的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void function(int a,int b,int c);这里的int占2个字节
{
int i=0;
.......;
}
;;;;;;;;;;;;;;;;;
mov ax,a
push ax
mov ax,b
push ax
mov ax,c
push ax
call funciton;16位调用 call会压栈2个参数 4个字节,32位的话就是8个字节
add sp,6;因为之前我们压堆3个参数,共6个字节,函数调用完毕后恢复堆栈我们需要+6
;;;;;;;;;;;;;;;;;;
function:
	push	bp;将堆栈底压缩堆栈
	mov	bp,sp;将堆栈头指针传入sp
;注意 在gcc编译器中 会将上述两个代码放在call之外执行
        ;接下来我们需要手动控制堆栈头BP(注意,此时BP存入的是堆栈头指针,BP在整个函数中不能写入数据)
	sub sp-2;int i;   
	mov [bp-2],0;等于i=0;两句合起来就是int i=0;以后操纵i就是将[bp-2]
;参数a变量就是[bp+10] b是[bp+8] c是[bp+6]
;[bp+0]到[bp+4]存入的是调用function时的IP 和CS
	mov sp,bp;恢复到进入函数的堆栈头指针
	pop bp;恢复堆栈底
ret

|-------|10h
|-------|
|-------| esp;进入函数之后此时ESP在当前位置 esp-xxh存放的是临时变量 esp+xxh就是函数参数
|-------|
|-------|
|-------|
|-------|
|-------|
|-------|ebp:100h

。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值