zoukankan      html  css  js  c++  java
  • gdb调试

    ·代码(实验楼中的代码,改了部分数值)命名为test.c

    int g(int x)
    {
      return x + 7;
    }
    
    int f(int x)
    {
      return g(x);
    }
    
    int main(void)
    {
      return f(3) + 5;
    }
    

    ·在64位的机器上产生32位汇编(使用指令为:gcc - g test.c -o test -m32),然后使用gdb test指令进入gdb调试器,进入后在main这里设置一个断点,然后运行:

    ·
    ·使用指令:disassemble获取汇编代码,指令:info registers查看各寄存器的值:

    此时主函数的基址为Ox80483d8

    ·使用指令:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句

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

    ·将上一个函数的基址入栈,从当前%esp开始作为新基址:

    ·为传参做准备,然后实参入栈:

    ·f函数的汇编代码:

    ·实参入栈,然后call指令将下一条指令的地址入栈:

    ·分配栈空间:

    ·将%eax与立即数7相加:

    ·在结束前弹栈:

    ·结束函数并与立即数相加:

    ·leave返回栈然后进入main函数:

    ·ret结束main函数:

  • 相关阅读:
    java-日期转换
    java-Timestamp
    java-判断年份是不是闰年
    Java中Date与String的相互转换
    ORA-01830
    js数组合并
    js清空子节点
    私钥密码
    图片基本样式
    XMLHttpRequest: 网络错误 0x2ee4, 由于出现错误 00002ee4 而导致此项操作无法完成
  • 原文地址:https://www.cnblogs.com/lx20145332/p/6131040.html
Copyright © 2011-2022 走看看