LINUX.ORG.RU

Проблема с Hello World на асме

 ,


0

2

Пытаюсь скомпилить в убунте 64 следующий код:

section	.text
   global _start    ; необходимо для линкера (ld)
	
_start:	            ; сообщает линкеру стартовую точку
   mov	edx,len     ; длина строки 
   mov	ecx,msg     ; строка
   mov	ebx,1       ; дескриптор файла (stdout)
   mov	eax,4       ; номер системного вызова (sys_write)
   int	0x80        ; вызов ядра
	
   mov	eax,1       ; номер системного вызова (sys_exit)
   int	0x80        ; вызов ядра 
 
section	.data
msg db 'Hello, world!', 0xa  ; содержимое строки для вывода
len equ $ - msg              ; длина строки
$ nasm -f elf64 hello.asm 
$ ld -m elf_x86_64 -s -o hello hello.o
$ ./hello
Segmentation fault (core dumped)


Если собрать для elf_i386:
bash: ./hello: cannot execute binary file: Exec format error

Я что-то делаю не так? Или код кривой? Взял его отсюда https://ravesli.com/assembler-bazovyj-sintaksis/

Я что-то делаю не так? Или код кривой?

Да. Ты пытаешься компилировать 32-битный ассемблерный код под 64 бита. У тебя в верхней части каждого регистра может быть полный шлак, например.

hateyoufeel ★★★★★ ()
Ответ на: комментарий от anarquista

Ну давай добавим тогда, что вместо int 0x80 лучше использовать syscall.

hateyoufeel ★★★★★ ()

Про syscall ещё не забудь.

d ★★★★ ()
Ответ на: комментарий от AdonisSexyBoy

Спасибо, но не получается.

Такого пакета нет: apt-get install multiarch-support

А такое не помогло: dpkg –add-architecture i386

Бинарник собранный с elf_i386 все равно показывает

-bash: ./hello: cannot execute binary file: Exec format error

lvmuser ()
Ответ на: комментарий от AdonisSexyBoy

Сделал apt update Взял ваши команды:

$ nasm -f elf32 hello.asm $ ld hello.o -m elf_i386 $ ./a.out bash: ./a.out: cannot execute binary file: Exec format error

У вас скомпилился именно код из поста?

lvmuser ()
Ответ на: комментарий от lvmuser

Странно, попробуй сделать apt install libc6:i386

У вас скомпилился именно код из поста?

Да.

AdonisSexyBoy ()

Покажи uname -a и file hello.

Вдруг окажется, что у тебя «гранаты не той системы» - какой-нибудь WSL, у которой проблемы 32-битными приложениями.

anonymous ()
Ответ на: комментарий от lvmuser

https://superuser.com/questions/1407730/run-32-bit-application-on-ubuntu-on-windows-subsystem-for-linux

You simply can’t do that. WSL doesn’t support 32-bit apps!

Most (if not all) Intel and AMD CPUs in the last decade support the x86_64 instruction set and there’s no reason for Microsoft to spend time and money on supporting a 32-bit version of Linux. Most developers and Ubuntu users are running the 64-bit version anyway

No, we don’t support x86 32-bit at this time: We currently depend on x64-only instructions and mechanisms to ensure fast & stable performance.

lvmuser ()
Ответ на: комментарий от Siborgium

Ну тут без @Assembler не разобраться.

Я вообще, когда прочитал заголовок, сразу подумал, что это его новый аккаунт.

anonymous ()
Ответ на: комментарий от lvmuser

Тебе нужен binutils-gold, или как он там в убунте называется.

Myau ★★★★ ()

проблемы с hello world

Может фронтенд тогда?

anonymous ()
nasm -f elf32 hello.asm
gcc -m32 hello.o -o hello

anonymous ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.