У меня работает. Вот что я сделал (заметьте, я на 64-битном компьютере, поэтому у меня есть дополнительный флаг для создания 32-битного бинарного файла):
test.asm
_start:
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
jmp short string
code:
pop ecx
mov bl,1
mov dl,13
mov al,4
int 0x80
dec bl
mov al,1
int 0x80
string:
call code
db 'Hello, World!'
команды:
$ nasm -felf test.asm -o test.o
$ gcc -m32 -nostdlib -nostdinc test.o -o test
, который выдал предупреждение, но это нормально.
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.1/../../../../x86_64-pc-linux-gnu/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080
Тогда я побежал:
$ ./test
и это действительно вывод "Hello, World!"
(без перевода строки). Никаких ошибок.