用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命令查看代码

用gdb调试nasm汇编程序_第1张图片

  

 

 

 

 

 

  2.2 将main设置为断点

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

  2.4 查看此时寄存器的值

用gdb调试nasm汇编程序_第2张图片

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

用gdb调试nasm汇编程序_第3张图片

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

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

用gdb调试nasm汇编程序_第4张图片

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

  2.8 打印某个寄存器的值

3 总结

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

你可能感兴趣的:(ASM)