zoukankan      html  css  js  c++  java
  • GDB调试汇编堆栈过程分析

    • 源代码:

    • 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器,在main函数设置断点,run一下:

    • 使用disassemble指令获取汇编代码:

    • 用i(info) r(registers)指令查看各寄存器的值, 此时主函数的栈基址为0xbffff344,用x(examine)指令查看内存地址中的值

    • 设置:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。用x(examine)指令查看内存地址中的值

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

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

    • 为传参做准备:

    • 实参计算在%eax中进行:

    • f函数汇编代码:

    • 传参:

    • 实参入栈:

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


    • 计算short+int:



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

    • ret指令将栈顶弹给%eip:

    • 因为函数f修改了%esp,所以用leave指令恢复。leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp:


    • leave指令恢复

    指令 %eip %esp %ebp %eax
    movl $0x8,(%esp) 0x80483e2 0xbffff344 0xbffff348 0x1
    call 0x80483c4 0x80483e9 0xbffff344 0xbffff348 0x1
    push %ebp 0x80483c4 0xbffff340 0xbffff348 0x1
    mov %esp,%ebp 0x80483c5 0xbffff33c 0xbffff348 0x1
    sub $0x4,%esp 0x80483c7 0xbffff33c 0xbffff33c 0x1
    mov 0x804a014,%eax 0x80483ca 0xbffff338 0xbffff33c 0x1
    add $0x8(%ebp),%eax 0x80483c5 0xbffff33c 0xbffff348 0x2
    mov %eax,(%esp) 0x80483d2 0xbffff338 0xbffff33c 0xa
    call 0x80483b4 0x80483d5 0xbffff338 0xbffff33c 0xa
    push %ebp 0x80483b4 0xbffff334 0xbffff33c 0xa
    mov %esp,%ebp 0x80483b5 0xbffff330 0xbffff33c 0xa
    movzwl 0x804a010,%eax 0x80483b7 0xbffff330 0xbffff330 0xa
    cwtl 0x80483be 0xbffff330 0xbffff330 0x1
    add 0x8(%ebx),%eax 0x80483bf 0xbffff330 0xbffff330 0x1
    pop %ebx 0x80483c2 0xbffff330 0xbffff330 0xb
    ret 0x80483c3 0xbffff334 0xbffff33c 0xb
    leave 0x80483da 0xbffff338 0xbffff33c 0xb
    ret 0x80483db 0xbffff340 0xbffff348 0xb
    mov 0x80484d0,%edx 0x80483ee 0xbffff344 0xbffff348 0xb
    add %edx,%eax 0x80483f4 0xbffff344 0xbffff348 0xb
    leave 0x80483f6 0xbffff344 0xbffff348 0xe
    ret 0x80483f7 0xbffff34c 0x0 0xe
    指令 栈帧
    movl $0x8,(%esp) 0x0
    call 0x80483c4 0x8 0x0
    push %ebp 0x80483ee 0x8 0x0
    mov %esp,%ebp 0xbffff348 0x80483ee 0x8 0x0
    sub $0x4,%esp 0xbffff348 0x80483ee 0x8 0x0
    mov 0x804a014,%eax 0xbffff348 0x80483ee 0x8 0x0
    add $0x8(%ebp),%eax 0xbffff348 0x80483ee 0x8 0x0
    mov %eax,(%esp) 0xbffff348 0x80483ee 0x8 0x0
    call 0x80483b4 0xa 0xbffff348 0x80483ee 0x8 0x0
    push %ebp 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
    mov %esp,%ebp 0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
    movzwl 0x804a010,%eax 0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
    cwtl 0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
    add 0x8(%ebx),%eax 0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
    pop %ebx 0xbffff33c 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
    ret 0x80483da 0xa 0xbffff348 0x80483ee 0x8 0x0
    leave 0xa 0xbffff348 0x80483ee 0x8 0x0
    ret 0xa 0x80483ee 0x8 0x0
    mov 0x80484d0,%edx 0x8 0x0
    add %edx,%eax 0x8 0x0
    leave 0x8 0x0
    ret
  • 相关阅读:
    计算机技术与软件专业以考代评政策之我见
    关于设立运营部门的我的几点建议
    自助式微软BI工具PowerPivot简介!
    写在两年前的公司新版CRM系统需求探讨
    实时音视频开发之开源项目
    vue3.0 使用vue脚手架生成vue项目 运行mapbox 3D地图例子
    Vue开发工具Visual Studio Code 配置插件
    sip协议开源实现
    redis操作
    SIP协议 Java开源jar
  • 原文地址:https://www.cnblogs.com/jdy1453/p/6130961.html
Copyright © 2011-2022 走看看