2013-02-20 2 views
2

Следующий код не работает, как ожидалось:Сборка 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. Могу ли я как-то подражать этому?

ответ

2

Речь идет не о модели памяти.

В газовой синтаксисе mov ecx, hello_world означает чтение из адреса памятиhello_world, может быть подтвержден путем проверки разборки сделано с ndisasm:

00000000 BB01000000  mov ebx,0x1 
00000005 8B0C25D4104000 mov ecx,[0x4010d4] 
0000000C BA0D000000  mov edx,0xd 
00000011 B804000000  mov eax,0x4 
00000016 CD80    int 0x80 

Что вы хотите в магазине адрес памяти из hello_world , В газе путь для достижения этой цели является mov ecx, offset hello_world, что может быть подтверждено с разборкой:

00000000 BB01000000  mov ebx,0x1 
00000005 B9D4104000  mov ecx,0x4010d4 
0000000A BA0D000000  mov edx,0xd 
0000000F B804000000  mov eax,0x4 
00000014 CD80    int 0x80 

Кстати, еще один способ сделать загрузку адреса памяти в регистр является leaecx, hello_world.

Некоторые другие сборщики (такие как NASM и Yasm) имеют разный синтаксис, и эта разница может привести к путанице, так как может быть проиллюстрирована с небольшим столом:

gas       NASM/YASM    ndisasm disassembly 
mov ecx,hello_world   mov ecx,[hello_world] mov ecx,[0x4010d4] 
mov ecx,[hello_world]   mov ecx,[hello_world] mov ecx,[0x4010d4] 
mov ecx,offset hello_world mov ecx,hello_world  mov ecx,0x4010d4 
+0

ли не 'мов ECX, $ hello_world' работа в газе? –

+0

@AlexeyFrunze Сборка с 'как test.as -o test.o' не вызывает никаких проблем, но связь с' ld test.o -o test' не выполняется: 'test.o (.text + 0x8): error: неопределенная ссылка на «$ hello_world». – nrz

+0

Ничего, мозговое искусство. –

Смежные вопросы