在as汇编中,以.开头的语句为汇编命令(或称为伪指令、指示符)
8个通用寄存器介绍:
eax:累加器(Accumulator)
ebx:基地址寄存器(Base Register)
ecx:计数寄存器(Count)
edx:数据寄存器(Data Register)
ebp:堆栈基指针(Base Pointer)
esi和edi:变址寄存器(Index Register)
esp:堆栈顶指针(Stack Pointer)
6个段寄存器:
CS 代码段、SS? stack segment、DS? 数据段、ES??数据段、FS??数据段、GS??数据段
1个状态寄存器:EFLAGS
1个指令寄存器:EIP
80386的寄存器,共16个,8个通用(如前所述)、段寄存器(6个)、状态寄存器和指令寄存器
堆栈回溯:
调试信息标准DWARF(Debugging With Attributed Record Formats)定义了一个.debug_frame section用来解决上述的难题
但是.debug_frame面临一个难题:怎么样生成堆栈信息表?
为了解决上述难题,GAS(GCC Assembler)汇编编译器定义了一组伪指令来协助生成调用栈信息CFI(Call Frame Information)。CFI directives伪指令是一组生成CFI调试信息的高级语言
下表展示的是16bit寄存器 , 32bit寄存器的前缀是 e, 64bit的寄存器前缀是 r。
【编译、链接、装载五】编译器后端——gcc生成的汇编代码_cfi_startproc-CSDN博客
子函数使用之前将这些寄存器的值保存在栈中,待子函数使用完成后,再将栈中保存的值还给寄存器。根据谁负责保存这些寄存器,可以把它们分为两类:“调用者保存”和“被调用者保存”。“调用者保存”(caller-saved):即在调用子函数之前,将父函数用过的寄存器压栈;“被调用者保存”:即在子函数内,对即将使用的寄存器压栈。?
调用者保存寄存器 | 被调用者保存寄存器 |
---|---|
%r10,%r11 | %rbx, %rbp, %r12-15 |
如何编译不带:调试用的调用堆栈的
gcc -S hello.c -o hello.s -fno-asynchronous-unwind-tables?