导航

函数调用与堆栈清理

Posted on 2006-11-08 11:19  InterMa  阅读(1185)  评论(0编辑  收藏  举报
今天看了一会《Professional Assembly Language》,在P104函数调用的地方,看到了一些好东东,摘抄如下:
(如果你不了解函数调用与堆栈清理的基础概念,详见:http://www.turbozv.com/read.php?78 ,赶快补补)

首先是一个函数的模版,它自己(被调用方)清理堆栈(这个就是__stdcall了):
function_label:
    pushl 
%ebp
    movl 
%esp, %ebp
    # your code goes here
    movl 
%ebp, %esp
    popl 
%ebp
    ret
还用注意call function_label的时候首先将%eip入栈,然后ret的时候恢复saved %eip => %eip。

如果是调用C的库函数,例如:printf(),那就要调用方清理堆栈了(__cdecl):
.section .data
output:
    .asciz 
"This is section %d\n"

.section .text

    pushl $
1
    pushl $output
    call printf
    add $
8%esp # clear up stack

顺便补2个常见的Asm操作:
【1】为auto变量分配空间:
直接操作%esp就可以了,例如:subl $24, %esp #分配24个字节。
访问局部变量的时候,直接使用%ebp+偏移就可以了。
【2】地址对齐:
andl $-16, %esp #按16地址对齐。