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