Skip to content

Latest commit

 

History

History
71 lines (58 loc) · 1.81 KB

assembly.md

File metadata and controls

71 lines (58 loc) · 1.81 KB

汇编

寄存器

  • ESP:堆栈指针(stack pointer)
  • EBP:基址指针(base pointer),在C语言中用作记录当前函数调用基址
  • CS:代码段寄存器
  • EIP:总是指向下一条的指令地址
    • call:将当前CS:EIP的值压入栈顶,CS:EIP指向被调用函数的入口地址
    • ret:从栈顶弹出原来保存在这里的CS:EIP的值,放入CS:EIP

函数调用

函数调用

C++
#include <iostream>

//defalut type is cdecl
//m64没有差异?函数参数不使用堆栈传递,直接使用了寄存器了

//函数调用结束后由被调用函数清除栈内数据
//#define CALLTYPE __attribute__((cdecl))
//函数调用结束后由调用函数清除栈内数据
#define CALLTYPE __attribute__((stdcall))

CALLTYPE int func(int v)
{
  return v * 2;
}

int main()
{
  return func(5);
}
Assembly
main:
.LFB1520:
  .cfi_startproc
  endbr32
  pushl	%ebp                          #旧基址进栈保存
  .cfi_def_cfa_offset 8
  .cfi_offset 5, -8
  movl	%esp, %ebp                    #新栈(基址)
  .cfi_def_cfa_register 5
  call	__x86.get_pc_thunk.ax         #把esp的内容赋值给eax (movl (%esp),%eax)
  addl	$_GLOBAL_OFFSET_TABLE_, %eax
  pushl	$5                            #函数参数入栈
  call	_Z4funci                      #函数调用
  addl	$4, %esp                      #函数参数出栈
  nop
  leave
  .cfi_restore 5
  .cfi_def_cfa 4, 4
  ret                                 #函数返回
  .cfi_endproc