用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 命令来查看,以后再慢慢加强。