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
。。