2015-01-02 38 views
3

我有這個源代碼:如何在nasm中包含調試信息?

; hello.asm a first program for nasm for Linux, Intel, gcc 
; 
; assemble: nasm -f elf -l hello.lst hello.asm 
; link:  gcc -o hello hello.o 
; run:   hello 
; output is: Hello World 

    SECTION .data  ; data section 
msg: db "Hello World",10 ; the string to print, 10=cr 
len: equ $-msg  ; "$" means "here" 
       ; len is a value, not an address 

    SECTION .text  ; code section 
     global main  ; make label available to linker 
main:    ; standard gcc entry point 

    mov edx,len  ; arg3, length of string to print 
    mov ecx,msg  ; arg2, pointer to string 
    mov ebx,1  ; arg1, where to write, screen 
    mov eax,4  ; write command to int 80 hex 
    int 0x80  ; interrupt 80 hex, call kernel 

    mov ebx,0  ; exit code, 0=normal 
    mov eax,1  ; exit command to kernel 
    int 0x80  ; interrupt 80 hex, call kernel 

此代碼是從here拍攝。

我正在運行ubuntu 12.04 32位用於學習目的的VirtualBox。

步驟我跟着是:

  • NASM -f精靈-g -F刺hello.asm
  • LD -o你好hello.o
  • GDB你好-tui

現在,當我只運行你好它會正常運行,但gdb未能顯示任何源代碼。爲什麼?當我嘗試在gdb中運行我會看到Hello World文字很好,但它不顯示源代碼。

+0

這是nasm或gdb中某處的錯誤。請注意,例如,如果您開始執行'si','gdb'會很高興地向您顯示源代碼。 – Jester

+0

你是什麼意思「開始做si」@Jester? –

+0

使用'si'命令來單步說明。 'gdb'將正確顯示源代碼。首先使用'start'而不是'run'或手動放置斷點。 – Jester

回答

4

它看起來像刺的格式不GDB工作,嘗試矮代替(http://en.wikipedia.org/wiki/DWARF

與編譯

NASM -f精靈-g -F矮hello.asm

在gdb型

然後

開始

然後

SI

你會等等看的來源與評論。正如Koray Tugay所說,gdb中很可能存在一個bug。

+0

可能還會幫助將'nop'作爲...之後的第一條指令......以及您正在使用'main'。 'ld'沒有抱怨缺少一個入口點嗎? 'ld'通常期望'_start' - 'gcc'(就像它說你在哪裏找到代碼)期望'main'。告訴'ld'' -e main'或將其改爲'_start'來關閉'ld'或者使用'gcc' ... –

+0

@FrankKotler感謝您的信息。 _start讓ld不再抱怨了。但是這是什麼原因呢?我可以閱讀的任何來源? –

+0

一些教程在這裏:http://asm.sourceforge.net/resources.html#tutorials您可能會在「teensy」教程中找到這樣的信息,儘管編寫迷人的短文件可能不是您想要做的事情。當然有'男人'...... –