操作系统是怎么工作的——函数的堆栈框架/嵌入式代码

时间:2023-03-09 19:32:25
操作系统是怎么工作的——函数的堆栈框架/嵌入式代码

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)