用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編程匯編


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM