我正在学习汇编程序,并发现以下令人惊讶的内容。我基本上从互联网的某个地方复制了一些你好的世界代码
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
因此指令不会出现。
我非常感谢有关正在发生的事情或在何处了解正在发生的事情的暗示。
答案 0 :(得分:1)
您的指令在反汇编中无法正确显示的原因只是它开始反汇编的位置以及指令如何发生的对齐问题。因为x86具有可变长度指令,所以反汇编程序需要知道一个入口点。正确的列表更像是:
00000080 BA0E000000 mov edx,0xe ; I think
00000085 B9A0900408 mov ecx,0x80490a0
...
真正的问题在于它似乎与gdb有关,可能与您设置断点的方式有关(另外,我无法回想起gdb在第一条指令之前是否断线,我必须检查)。