NASM&;GDB:丢失第一条指令

NASM&;GDB:丢失第一条指令,gdb,nasm,Gdb,Nasm,我正在学习汇编程序,发现下面有些令人惊讶。我实际上是从互联网上的某个地方复制了一些hello world代码 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

我正在学习汇编程序,发现下面有些令人惊讶。我实际上是从互联网上的某个地方复制了一些hello world代码

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指令上设置断点,程序不会停止。在我得到的结果文件(我认为相关的部分)上运行NDISAM(NDISSM-b32 hellow):

因此,该指令不会出现


如果能给我一个提示,告诉我发生了什么,或者去哪里了解发生了什么,我将不胜感激。

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

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

真正的问题似乎是gdb,可能是您如何设置断点(另外,我不记得gdb是否在第一条指令之前中断,我必须检查)。

事实上,我通过向NDISSM添加“同步点”找到了这些指令:NDISSM-b32-s0X80 hellow。然后按照您的建议对指令进行解码。我假设我的二进制格式包含的信息是起始点在80,但是readelf建议_start在08048080,然后以80结尾似乎与我无关。@kasterma IIRC可执行文件的开头实际上是linux/386上的内存地址0x08048000如果我使用gcc链接,我会得到一个更大的可执行文件,但我可以在第一条指令上设置一个运行断点。
00000080  BA0E000000      mov edx,0xe ; I think
00000085  B9A0900408      mov ecx,0x80490a0
...