zoukankan      html  css  js  c++  java
  • 20145316GDB调试汇编堆栈

    GDB调试例子的汇编堆栈

    • 代码
    • 直接-m32编译出现问题
    • 编译64位Linux版本32位的二进制文件,需要安装一个库,使用指令sudo apt-get install libc6-dev-i386
    • 编译成功,进入gdb调试界面
    • 在main处设置断点、运行并获取汇编代码查看各寄存器状态

    • 主函数栈基址为0xffffd104,值为0

    • call指令将下一条指令地址入栈,%esp、%ebp值发生变化

    • 上一个函数的基址入栈,从当前%esp开始作为新基址,原地址压栈保存

    • 为传参做准备

    • 实参计算在%eax中进行

    • f函数汇编代码

    • 实参入栈

    • call指令将下一条指令的地址入栈




    • 计算short+int

    • pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节



    • ret指令将栈顶弹给%eip


     

    堆栈情况

    指令

    %esp

    %ebp

    堆栈

    movl$0x8,(%esp)

    0ffffd104

    0ffffd108

    0x0

    call 0x8048401

    0ffffd100

    0ffffd108

    0x8 0x0

    push %ebp

    0ffffd100

    0ffffd108

    0x804842e 0x8 0x0

    mov %esp,%ebp

    0ffffd0fc

    0ffffd108

    0xffffd108 0x804842e 0x8 0x0

    mov 0x804a01c,%edx///

    0ffffcf6c

    0ffffcf6c

    0xffffcf78 0x804842e 0x8 0x0

    call 0x80483ed

    0ffffd0f8

    0ffffd0fc

    0xa 0xffffd108 0x804842e 0x8 0x0

    push %ebp

    0ffffd0f4

    0ffffd0fc

    0x804841a 0xa 0xffffd108 0x804842e 0x8 0x0

    mov %esp,%ebp

    0ffffd0f0

    0ffffd0fc

    0xffffd0fc 0x804841a 0xa 0xffffcd108 0x804842e 0x8 0x0

    movzwl 0x804841a,%eax

    0ffffd0f0

    0ffffd0f0

    0xffffd0fc 0x804841a 0xa 0xffffcd108 0x804842e 0x8 0x0

    ret

    0ffffd0f4

    0xffffd0fc

    0x804841a 0xa 0xffffcd108 0x804842e 0x8 0x0

    leave

    0ffffd0f8

    0ffffd0fc

    0xa 0xffffcd108 0x804842e 0x8 0x0

    ret

    0ffffd100

    0ffffd108

    0x804842e 0x8 0x0

    leave

    0ffffd104

    0ffffd108

    0x8 0x0

    ret

    0xffffd10c

    0x0

     

     

  • 相关阅读:
    HDOJ线段树专题(A Simple Problem with Integers)
    COJ1183(计算表达式的值)
    理解匈牙利算法求二分匹配
    COJ1143(走迷宫)
    COJ1184格林布的地雷
    POJ2387(Til the Cows Come Home)
    POJ3264(Balanced Lineup)
    调用android手机微博客户端发送微博
    用位来保存信息
    为什么类的成员变量是自身类型时只可以声明
  • 原文地址:https://www.cnblogs.com/xxy745214935/p/6131127.html
Copyright © 2011-2022 走看看