今天看了一会《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地址对齐。

相关文章:

  • 2021-09-21
  • 2022-12-23
  • 2021-11-28
猜你喜欢
  • 2021-07-22
  • 2021-12-19
  • 2021-08-15
  • 2022-01-07
相关资源
相似解决方案