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编程汇编
  • 相关阅读:
    HDU 4348 To the moon(可持久化线段树)
    HDU 5875 Function 大连网络赛 线段树
    HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
    HDU 5876 大连网络赛 Sparse Graph
    HDU 5701 中位数计数 百度之星初赛
    CodeForces 708B Recover the String
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    ASP.NET生成验证码
    ASP.NET生成验证码
    ASP.NET生成验证码
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3038281.html
Copyright © 2011-2022 走看看