X86-64的出现,给GCC提供了一个绝好的机会,在新的x86-64机器上,放弃保守的假设,进而充分利用x86-64的各种特性,比如:在过程调用中,通过寄存器来传递参数,而不是传统的堆栈。又如:尽量使用条件传送指令,而不是控制跳转指令。 寄存器简介 先明确一点,本文关注的是通用寄存器(后简称寄存器)。既然是通用的,使用并没有...
栈帧的概念可以从下图 当前帧 具象理解 该架构下,堆栈由高地址往低地址生长 (栈顶在低地址) 调用函数完成后,当前寄存器 %rbp 存储当前栈帧指针所在内存的地址; %rsp 存储当前整个堆栈的栈顶指针所在的地址。 当前栈帧指针所在内存的地址存储了 上一栈帧的栈帧指针所在内存的地址 当前栈帧指针所在内存的地址的上...
movq%rbp,%rsp ; 使%rsp 和%rbp 指向同一位置,即子栈帧的起始处, 收回子栈帧空间 popq%rbp ; 将栈中保存的父栈帧的%rbp 的值赋值给%rbp,并且%rsp 上移一个位置指向父栈帧的结尾处 为了便于栈帧恢复,x86_64 架构中提供了 leave 指令来实现上述两条命令的功能。执行 leave 后,前面图中函数调用的栈帧...
在这段空间上保存调用者栈帧的基址(ebp)、本函数的局部变量、调用其他函数时的返回地址, 并在需要时保存调用者使用的寄存器值, 被调函数结束后esp上移表示释放这段空间,然后回到调用者的占用的空间与代码位置继续执行, 函数运行阶段在调用栈上占用的这段空间就叫做栈帧,是编译原理运行时空间组织中活动记录(activatio...
在x86_64体系架构中,总共有16个64位通用寄存器,各寄存器及用途如下所示: 对上图中的寄存器做简单说明: %rax :通常存储函数调用的返回结果,也被用在idiv (除法)和imul(乘法)命令中。 %rsp :堆栈指针寄存器,指向栈顶位置。pop操作通过增大rsp的值实现出栈,push操作通过减小rsp的值实现入栈。
X86-64的出现,给GCC提供了一个绝好的机会,在新的x86-64机器上,放弃保守的假设,进而充分利用x86-64的各种特性,比如:在过程调用中,通过寄存器来传递参数,而不是传统的堆栈。又如:尽量使用条件传送指令,而不是控制跳转指令。 寄存器简介 先明确一点,本文关注的是通用寄存器(后简称寄存器)。既然是通用的,使用并没有...
X86-64寄存器的变化,不仅体现在位数上,更加体现在寄存器数量上。新增加寄存器%r8到%r15。加上x86的原有8个,一共16个寄存器。 刚刚说到,寄存器集成在CPU上,存取速度比存储器快好几个数量级,寄存器多了,GCC就可以更多的使用寄存器,替换之前的存储器堆栈使用,从而大大提升性能。
3、化选项,但是这对应用程序开发者提出了很高的耍求.会: 4 X86-64的出现,给 GCC提供了一个绝好的机会.在新的x86-64机器上,放弃保守的假设.进而充分利用x86-64的各种特 性比如:在过程调用中.通过寄存器來传递参数.而不是传统的堆栈乂如:尽量使用条件传送指 令,而不是控制跳转指令寄存器简介先明确一点.A文关...
x86_64函数调用惯例及其栈帧 为了向栈中注入我们自己的代码,首先需要了解的是函数调用时的栈的变化。需要提前说明的是,x86是小端结构,栈的起点位于高地址。 写一段简单的代码: gcc call.c -o callobjdump -d call 编译之后,让我们看看可执行文件的情况。