Проверка значения регистра

Последнее обновление: 28.12.2022

Поскольку для вывода на экран числа из регистра в ассемблере придется написать много кода с кучей инструкций, а специальные дебаггеры под архитектуру ARM64 могут быть недоступны, особенно если мы пишем программу на машине с процессором Intel/AMD, то на начальных этапах можно использовать системные вызовы Linux. Так, системная функция Linux с номером 93, которая применяется для вывода из программы возвращает значение из регистра X0/W0. То есть мы можем положить в регистр X0 некоторое значение и выполнить системную функцию Linux 93. Например, определим простейшую программу:

.global _start          // адрес входной точки в программу

_start: 
    MOV X0, #16     // Загружаем число 16 в регистр X0
    MOV X8, #93            // номер функции Linux для выхода из программы - 93
    SVC 0                  // Вызываем функцию и выходим из программы

В регистр X0 помещается числовой код ошибки. В обычном случае в него помещается число 0, что говорит об нормальном завершении программы. Но в данном случае это не имеет большого значения, и мы помещаем в регистр X0 число 16 и вызываем системную функцию 93 для выхода из программы. Опять же мы можем даже на консоли устройства Android увидеть результат. так, для компиляции приложения откроем терминал/командную строку и командой cd перейдем к папке, где расположен файл hello.s с исходным кодом программы. И для компиляции выполним команду:

aarch64-none-elf-as hello.s -o hello.o

Затем скомпонуем программу в исполняемый файл с помощью линкера aarch64-none-elf-ld командой:

aarch64-none-elf-ld hello.o -o hello

Рассмотрим получения значения регистра X0 на примере устройства Android. Подключем устройство с Android к компьютеру. С помощью утилиты adb переместим скомпилированный файл hello на устройство под Android с помощью следующей команды

[Путь_к_файлу_adb]/adb push hello /data/local/tmp/hello

То есть в данном случае используем команду push для помещения копии файла hello на смартфон в папку /data/local/tmp/

Далее перейдем к консоли устройства Android с помощью команды:

adb shell

Далее перейдем к папке /data/local/tmp с помощью команды

cd /data/local/tmp

Затем изменим режим файла, чтобы его можно было запустить:

chmod +x hello

и в конце выполним файл hello

./hello

После выполнения программы на консоль смартфона должно быть выведено число из регистра X0. Дополнительно мы можем выполнить команду

echo $?

Она также выводит результат выполненной функции 93

Просмотр содержимого регистра X0 на ассемблере arm64 на Android

Минусом подобного подхода является то, что мы ограничены числами размером в один байт. Но начальных этапах особенно в окружении, где мы не может проводить отладку с помощью внешних инструментов, такой вариант можно использовать в качестве временного решения.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850