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/



Последнее исправление: lvmuser (всего исправлений: 3)

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

Да. Ты пытаешься компилировать 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
() автор топика
Ответ на: комментарий от lvmuser

Видимо да, дело в WSL (((

Я - Ванга!

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

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

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

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

Пиши просто 64-битные приложения.

К ним надо искать другие примеры hello world :) Обязательно займусь

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

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

Myau ★★★★
()

проблемы с hello world

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

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.