次のコードは期待どおりに動作しません。
.intel_syntax noprefix
.arch i386
.data
hello_world:
.ascii "Hello world!\n"
hello_world_end:
.equ hello_world_len, hello_world_end - hello_world
.text
.global _start
_start:
mov ebx, 1
mov ecx, hello_world
mov edx, hello_world_len
mov eax, 4
int 0x80
mov ebx, 0
mov eax, 1
int 0x80
通り抜けたとき:
as test.s -o test.o
ld test.o -o test
./test
何も出力しません。行を変更すると:
mov ecx, offset hello_world ; added offset
それは正常に動作します。元のコードをコンパイルし--32 -march=i386
てリンクしようとしました-m elf_i386
が、まだ何も出力されません。
$ uname -a
Linux ubuntu 3.2.0-38-generic #60-Ubuntu SMP Wed Feb 13 13:22:43 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
これは、メモリ モデルが i386 のようにフラットではないために発生すると推測されます。何とかこれをエミュレートできますか?