**
关于函数
**
4.1
由系统提供的函数称为原函数(或源语)–因为其他一切都是建立在它们之上。
在汇编语言中,原语通常就是系统调用。
4.3
由于内存的结构,栈是从内存顶部开始向下增长的。当我们提到“栈顶”,请记住这是栈内存的底部。
movl (%esp), %eax :将栈顶的内容移入%eax
movl %esp, %eax :将%esp所含指针指向的值移入%eax
访问栈顶的下一个值:movl 4(%esp), %eax
函数开始执行时:
参数入栈
如果此时函数所需要的的所有局部变量需要两个字的内存
subl $8, %esp 指令可实现
当一个函数执行完毕后,会做三件事:
1.将其返回值存储到%eax。
2.将栈回复到调用函数时的状态。
3.将控制权还给调用他的程序。
movl %ebp,%esp
popl %ebp
ret
.type power,@function这条指令告诉连接器应该将符号power作为函数处理。当程序只在一个文件中是可省略。
pushl %ebp
movl %esp,%ebp
subl $4,%esp
书上的栈图:
底数 <<<<<12(%ebp)
指数 <<<<<8(%ebp)
返回值 <<<<<4(%ebp)
旧%ebp <<<<<(%ebp) 当前栈底
当前结果 <<<<<-4(%ebp)和(%esp) 当前栈顶
OD的栈图(用intel汇编形式)
当前结果 <<<<< ebp-4和%esp 当前栈顶
旧%ebp <<<<< ebp 当前栈底
返回值 <<<<< ebp+4
指数 <<<<< ebp+8
底数 <<<<< ebp+12