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