今天看了一会《Professional Assembly Language》,在P104函数调用的地方,看到了一些好东东,摘抄如下:
(如果你不了解函数调用与堆栈清理的基础概念,详见:http://www.turbozv.com/read.php?78 ,赶快补补)
首先是一个函数的模版,它自己(被调用方)清理堆栈(这个就是__stdcall了):
如果是调用C的库函数,例如:printf(),那就要调用方清理堆栈了(__cdecl):
顺便补2个常见的Asm操作:
【1】为auto变量分配空间:
直接操作%esp就可以了,例如:subl $24, %esp #分配24个字节。
访问局部变量的时候,直接使用%ebp+偏移就可以了。
【2】地址对齐:
andl $-16, %esp #按16地址对齐。
(如果你不了解函数调用与堆栈清理的基础概念,详见: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。pushl %ebp
movl %esp, %ebp
# your code goes here
movl %ebp, %esp
popl %ebp
ret
如果是调用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

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地址对齐。