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
因此指令不會出現。
我非常感謝有關正在發生的事情或去哪裏瞭解正在發生的事情的提示。
的確,我發現這些指令是通過向ndisasm添加一個「同步點」:ndisasm -b32 -s0X80 hellow。然後,按照您的建議解碼指令。我認爲我的二進制格式包含起始點爲80的信息,但是readelf表明_start在08048080,而其他以80結尾似乎與我無關。 – kasterma 2010-11-22 18:34:34