NASM& GDB:丢失第一条指令

时间:2010-11-22 17:32:10

标签: gdb nasm

我正在学习汇编程序,并发现以下令人惊讶的内容。我基本上从互联网的某个地方复制了一些你好的世界代码

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 elf -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 个答案:

答案 0 :(得分:1)

您的指令在反汇编中无法正确显示的原因只是它开始反汇编的位置以及指令如何发生的对齐问题。因为x86具有可变长度指令,所以反汇编程序需要知道一个入口点。正确的列表更像是:

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

真正的问题在于它似乎与gdb有关,可能与您设置断点的方式有关(另外,我无法回想起gdb在第一条指令之前是否断线,我必须检查)。