zoukankan      html  css  js  c++  java
  • 用gdb调试nasm汇编程序

    用gdb调试nasm汇编程序

     对于一个程序员来说,调试是很重要的,可以节约找到bug的时间,不过以前在linux下一直是对c进行调试的,今天突然要对汇编进行调试还真不知道怎么调,特别是对linux下调试汇编程序基本没搞过。记得以前上课学masm时,用的是debug,貌似映像中对汇编挺难调试的。于是就在网上查了下在linux下调试nasm汇编程序的资料,看起来比debug简单点。

    1 写和编译源文件

      首先准备个hello.asm文件,这个学语言必编的程序,代码如下:

    复制代码
        section .data
    msg:
        db "hello, world", 10
    len equ $-msg
    
        section .text
        global main
    main:
        mov edx, len
        mov ecx, msg
        mov ebx, 1
        mov eax, 4 ;直接使用sys_write系统调用
        int 0x80
    
        mov ebx, 0
        mov eax, 1
        int 0x80
    复制代码

      然后直接敲命令:nasm -f elf -l hello.lst -g hello.asm,-f elf是表示生产elf格式的目标文件,-g 是生产调试信息到目标文件,-l hello.lst对应的是指令和数据在段中偏移量,不要这个也可以。然后直接用命令gcc -g -o hello hello.o连接生成可执行文件,这个和c是一样的。注意在源代码中加:

        global main
    main:

    开始我就没加,用gcc连接的时候直接报下面的错误:

    其实这很正常,因为程序的入口函数是main,就像c中我们要写个main函数一样,gcc连接器在连接的时候就是找这个main标号,其实在目标代码中它就是一个符号名。

    2 调试

      和调试c语言一样,直接用gdb hello命令进入调试。

      2.1 用list命令查看代码

      

     

      2.2 将main设置为断点

      2.3 运行程序,然后程序直接到main出停下

      2.4 查看此时寄存器的值

      2.5 运行一条指令,用nexti,而next是运行一条语句。

    从上面可以看到edx的值已经改为13了。

      2.6 反汇编特点地址的代码。不过要先用命令set disassembly-flavor intel设置反汇编后显示什么类型的汇编代码,默认是AT&T类型的。左边的=>表示代码执行处。

      2.7 显示内存中的数据。也可以用来查看代码

      2.8 打印某个寄存器的值

    3 总结

      感觉用gdb调试比在windows下用debug更方便些,不过汇编的调试才刚开始学,还有很多不懂的,好在在gdb里对于不懂的命令可以中help 命令来查看,以后再慢慢加强

     
     
    分类: linux编程汇编
  • 相关阅读:
    网络流24题之 1738: 最小路径覆盖问题
    POJ 1966 Cable TV Network
    网络流24题- 魔术球问题
    网络流24题之 圆桌问题
    可持久化线段树维护启发式合并的可持久化并查集
    HDU 6166 Senior Pan
    ACM对拍cpp程序
    双联通分量复习
    欧拉回路求路径POJ 2230
    LCA的两种求法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3038281.html
Copyright © 2011-2022 走看看