1.函数堆栈框架
1.1框架模型
call指令:
1)将eip中的下一条指令的地址A保存在栈顶;
2)设置eip指向被调用程序的代码处。
ret指令:将地址A恢复到eip中
这样就将函数的调用变为顺序执行的指令流。
1.2框架形成
初始堆栈
1)call xxx(函数),执行call时, cs : eip原来的值指向call下一条指令,该值被保存到栈顶,然后cs : eip的值,指向xxx的入口地址。
cs:eip被压栈
2)进入xxx
第一条指令: pushl %ebp
上级函数的基地址压栈
第二条指令: movl %esp, %ebp
在原来堆栈的地址空间,创建了新的函数调用堆栈
函数体中的常规操作,可能会压栈、出栈
3)退出xxx
movl %ebp,%esp
popl %ebp
执行此命令后ebp指向原来的地址
ret
cs:eip出栈
2.嵌入式汇编
2.1格式
asm(
汇编语句模板:
输出部分:
输入部分:
破坏格式描述部分);
即格式为asm(“statements”:Output_regs:input_regs:clobbered_regs);
注:
2.2例子
注:%1,%2指输入输出部分,第一个编号为0,第二个编号为1……,因此%1代表c(寄存器ecx),%(寄存器edx)