汇编知识


    1.栈的栈底地址比栈顶地址大,栈顶指针指着的是最新push的数据。 c++

    2.举例说明栈的使用 shell

int func1(int a)
{
  int b = a + 1;
  return b;
}
int func0(int a)
{
  int b = func1(a);
  return b;
}

    经过如下命令将上述code编程成汇编代码: 编程

 g++ -g -S -O0 -m32 main.cpp -o-|c++filt >main.format.s    spa

c++filt 是为了Demangle symbols。-m32是为了编译成x86-32的。 指针

获得func0的汇编代码: code

func0(int):
        pushl   %ebp             #保存先前的栈底地址,而且使栈
                                 #顶地址加4,指向保存的栈底地址
        movl    %esp, %ebp       #设置新的栈底地址,使其等于当前的栈顶地址
        subl    $20, %esp        #预留20个字节用来定义局部变量
        movl    8(%ebp), %eax       
        movl    %eax, (%esp)
        call    func1(int)
        movl    %eax, -4(%ebp)     #将func1的结果存在当前栈中
        movl    -4(%ebp), %eax     #返回b
        leave                #1.将栈顶指针赋值给栈底指针2.pop出旧的地址,
                             #同时因为pop,栈底指针+4,则栈顶指针和栈底指针彻底变成原来的值
        ret                   #弹出call保存的地址,并跳转到这个位置
相关文章
相关标签/搜索