用gdb调试nasm汇编程序
對(duì)于一個(gè)程序員來(lái)說(shuō),調(diào)試是很重要的,可以節(jié)約找到bug的時(shí)間,不過(guò)以前在linux下一直是對(duì)c進(jìn)行調(diào)試的,今天突然要對(duì)匯編進(jìn)行調(diào)試還真不知道怎么調(diào),特別是對(duì)linux下調(diào)試匯編程序基本沒搞過(guò)。記得以前上課學(xué)masm時(shí),用的是debug,貌似映像中對(duì)匯編挺難調(diào)試的。于是就在網(wǎng)上查了下在linux下調(diào)試nasm匯編程序的資料,看起來(lái)比debug簡(jiǎn)單點(diǎn)。
1 寫和編譯源文件
首先準(zhǔn)備個(gè)hello.asm文件,這個(gè)學(xué)語(yǔ)言必編的程序,代碼如下:
section .data msg:db "hello, world", 10 len equ $-msgsection .textglobal main main:mov edx, lenmov ecx, msgmov ebx, 1mov eax, 4 ;直接使用sys_write系統(tǒng)調(diào)用int 0x80mov ebx, 0mov eax, 1int 0x80然后直接敲命令:nasm -f elf -l hello.lst -g hello.asm,-f elf是表示生產(chǎn)elf格式的目標(biāo)文件,-g 是生產(chǎn)調(diào)試信息到目標(biāo)文件,-l hello.lst對(duì)應(yīng)的是指令和數(shù)據(jù)在段中偏移量,不要這個(gè)也可以。然后直接用命令gcc -g -o hello hello.o連接生成可執(zhí)行文件,這個(gè)和c是一樣的。注意在源代碼中加:
global main main:開始我就沒加,用gcc連接的時(shí)候直接報(bào)下面的錯(cuò)誤:
其實(shí)這很正常,因?yàn)槌绦虻娜肟诤瘮?shù)是main,就像c中我們要寫個(gè)main函數(shù)一樣,gcc連接器在連接的時(shí)候就是找這個(gè)main標(biāo)號(hào),其實(shí)在目標(biāo)代碼中它就是一個(gè)符號(hào)名。
2 調(diào)試
和調(diào)試c語(yǔ)言一樣,直接用gdb hello命令進(jìn)入調(diào)試。
2.1 用list命令查看代碼
?
?
?
?
2.2 將main設(shè)置為斷點(diǎn)
2.3 運(yùn)行程序,然后程序直接到main出停下
2.4 查看此時(shí)寄存器的值
2.5 運(yùn)行一條指令,用nexti,而next是運(yùn)行一條語(yǔ)句。
從上面可以看到edx的值已經(jīng)改為13了。
2.6 反匯編特點(diǎn)地址的代碼。不過(guò)要先用命令set disassembly-flavor intel設(shè)置反匯編后顯示什么類型的匯編代碼,默認(rèn)是AT&T類型的。左邊的=>表示代碼執(zhí)行處。
2.7 顯示內(nèi)存中的數(shù)據(jù)。也可以用來(lái)查看代碼
2.8 打印某個(gè)寄存器的值
3 總結(jié)
感覺用gdb調(diào)試比在windows下用debug更方便些,不過(guò)匯編的調(diào)試才剛開始學(xué),還有很多不懂的,好在在gdb里對(duì)于不懂的命令可以中help 命令來(lái)查看,以后再慢慢加強(qiáng)。
總結(jié)
以上是生活随笔為你收集整理的用gdb调试nasm汇编程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux下挂载iso镜像的方法
- 下一篇: UTF-8、GB2312、GB18030