最終的な実行可能ファイルにリンクされた次のアセンブリ コードがあります。
section .text
global _start
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, 9
int 0x80
mesg db "Kingkong",0xa
私が次にしたことは、その16進コードを取得することでした
0xb8,0x04,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0xb9,0x76,0x80,0x04,0x08,0xba,0x09,0x00,0x00,0x00,0xcd,0x80,0x4b,0x69,0x6e,0x67,0x6b,0x6f,0x6e,0x67,0x0a
以下のような別のプログラムに配置します
section .text
global _start
_start:
db 0xb8,0x04,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0xb9,0x76,0x80,0x04,0x08,0xba,0x09,0x00,0x00,0x00,0xcd,0x80,0x4b,0x69,0x6e,0x67,0x6b,0x6f,0x6e,0x67,0x0a
上記のファイルをアセンブルしobjdump
てそれを乗り越えると、
08048060 <_start>:
8048060: b8 04 00 00 00 mov $0x4,%eax
8048065: bb 01 00 00 00 mov $0x1,%ebx
804806a: b9 76 80 04 08 mov $0x8048076,%ecx
804806f: ba 09 00 00 00 mov $0x9,%edx
8048074: cd 80 int $0x80
8048076: 4b dec %ebx
8048077: 69 6e 67 6b 6f 6e 67 imul $0x676e6f6b,0x67(%esi),%ebp
804807e: 0a .byte 0xa
mesg
ラベルが最終ダンプに表示されない場合、プログラムは上記のプログラムでセグメントのアドレスをどのように把握するのでしょmesg
うか?
編集:
答えを読んだ後、これに小さな質問を追加したいと思います。実際のアドレス指定にはラベルが使用されていないことを理解できますが、アドレスはコードに直接組み込まれています。ただし、アドレスがmov $0x8048076,%ecx
保証のように指定されている場合次回プログラムが読み込まれると、正確に同じアドレスから開始されます...このコードを C でラップするとどうなりますか? メモリ パターンがまったく異なる別のマシンで実行したい場合はどうすればよいですか。