Следующий код не работает, как ожидалось:Сборка i386 кода на x86_64
.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. Могу ли я как-то подражать этому?
ли не 'мов ECX, $ hello_world' работа в газе? –
@AlexeyFrunze Сборка с 'как test.as -o test.o' не вызывает никаких проблем, но связь с' ld test.o -o test' не выполняется: 'test.o (.text + 0x8): error: неопределенная ссылка на «$ hello_world». – nrz
Ничего, мозговое искусство. –