Незаконная инструкция по сборке ARM Raspberry Pi 4

Я впервые пытаюсь выполнить код сборки на своем Raspberry Pi 4 (извините, если код не отформатирован стандартным образом), и я пытаюсь выполнить свой код Hello World

.global _start

_start:
mov r0, #1
ldr r1, =helloworld
mov r2, #12
mov r8, #64
svc 0
mov r0, #0
mov r8, #93
svc 0

.data
helloworld: .ascii "Hello World\n"

Код компилируется без ошибок, но когда я пытаюсь выполнить свой код с помощью ./HelloWorld, я получаю arror Illegal Instruction без других сообщений. Есть идеи о том, что происходит?


person LordBobbiousX    schedule 27.12.2020    source источник
comment
Используйте отладчик и / или strace. Я предполагаю, что ваш последний вызов svc неверен, поэтому он не завершает процесс, а процессор продолжает выполнение.   -  person Jester    schedule 27.12.2020
comment
Также обратитесь к документации. Использование r8 подозрительно, также цифры странные. Какую ОС вы используете?   -  person Jester    schedule 27.12.2020
comment
Я обнаружил свою проблему, в книге, по которой я учусь, говорится, что мне нужно запустить 64-разрядную версию Linux на моем raspberry pi, но сейчас я использую 32-разрядный raspbian.   -  person LordBobbiousX    schedule 27.12.2020
comment
@LordBobbiousX Сборка для ARM64 и ARM32 существенно отличается. Я удивлен, что вы не заметили. Вы не можете запускать программы ARM64 на 32-битном Raspbian.   -  person fuz    schedule 27.12.2020


Ответы (1)


Вы используете 64-битные номера системных вызовов и ABI на 32-битном языке ассемблера, который предположительно находится в 32-битном процессе, который не работает.

Либо поместите 32-битный номер системного вызова в r7 (запись = 4, exit = 1), либо используйте 64-битный язык ассемблера (разные имена регистров) в 64-битном процессе.

person Timothy Baldwin    schedule 27.12.2020
comment
Обратите внимание, что номера системных вызовов Linux различаются на всех архитектурах. Не существует «64-битных номеров системного вызова» или «32-битных номеров системного вызова». Вместо этого есть «номера системных вызовов i386», «номера системных вызовов amd64», «номера системных вызовов ARM EABI» и так далее. - person fuz; 27.12.2020