2010-11-22 52 views
3

我在學習彙編語言,發現了一些令人驚訝的內容。我基本上是複製了一些世界你好代碼從某處互聯網NASM&GDB:失去第一條指令

section .text 
    global _start 

_start: 
    mov edx,len 
    mov ecx,msg 
    mov ebx,1 
    mov eax,4 
    int 0x80  ; interrupt for calling kernel 

    mov eax,1 
    int 0x80 

section .data 

msg db 'Hello, world!',0xa 
len equ $ - msg 

我編譯和NASM -f精靈-g hellow.asm,LD hellow.o -o hellow此鏈接上。如果我現在加載到gdb中,我可以列出代碼並運行它就好了。如果我在第一個mov指令上放置一個斷點,程序不會停在那裏。上生成的文件,我得到運行ndisasm(ndisasm -b32 hellow)(我認爲一部分是相關的):

0000007D 0000    add [eax],al 
0000007F 00BA0E000000  add [edx+0xe],bh 
00000085 B9A0900408  mov ecx,0x80490a0 
0000008A BB01000000  mov ebx,0x1 
0000008F B804000000  mov eax,0x4 
00000094 CD80    int 0x80 
00000096 B801000000  mov eax,0x1 
0000009B CD80    int 0x80 

因此指令不會出現。

我非常感謝有關正在發生的事情或去哪裏瞭解正在發生的事情的提示。

回答

1

你的指令在你的反彙編中沒有正確顯示的原因僅僅是它開始反彙編的地方以及指令如何落空。由於x86具有可變長度指令,反彙編程序需要知道入口點。正確的上市更像是:

00000080 BA0E000000  mov edx,0xe ; I think 
00000085 B9A0900408  mov ecx,0x80490a0 
... 

真正的問題是使用gdb這似乎可能與你如何設置斷點(加,如果GDB第一指令之前打破扼流圈我不記得,我必須檢查)。

+0

的確,我發現這些指令是通過向ndisasm添加一個「同步點」:ndisasm -b32 -s0X80 hellow。然後,按照您的建議解碼指令。我認爲我的二進制格式包含起始點爲80的信息,但是readelf表明_start在08048080,而其他以80結尾似乎與我無關。 – kasterma 2010-11-22 18:34:34