.syntax unified /* Использование синтаксиса ARM UAL */ .arch armv7e-m /* Архитектура ARMv7-M */ /* Секция кода в ПЗУ */ .text /* Указывает ассемблеру собирать эту секцию */ .thumb /* Использование Thumb ISA */ .global _start /* Экспорт символа _start */ /* Метка _start - начало программы */ .type _start, %function /* Указывает, что _start - функция */ _start: b main /* Переход к функции main */ .thumb_func .global main .type main, %function main: ldr r0, =str1 /* Загружаем адрес строки в регистр r0 */ ldr r1, =char_to_find /* Загружаем адрес искомого символа в регистр r1 */ ldrb r1, [r1] /* Загружаем значение искомого символа в регистр r1 */ bl strchr /* Вызываем функцию поиска символа (Выполняет переход на указанную метку и сохраняет адрес возврата в регистр lr) */ /* Остановка для проверки результата */ stop: b stop /* Бесконечный цикл для остановки программы */ .thumb_func .global strchr .type strchr, %function /* Реализация функции strchr */ strchr: .L_search: ldrb r3, [r0] /* Загружаем следующий символ из строки в r3 и увеличиваем r0 на 1 (загружает байт из памяти в регистр) */ cbz r3, .L_not_found /*(сравнение с 0) Если достигли конца строки (нулевой символ), переходим к .L_not_found */ cmp r3, r1 /* cmp Сравнивает текущий символ с искомым символом */ beq .L_found /* Если совпадают, переходим к .L_found (флаг Z) */ adds r0, #1 b .L_search /* Иначе продолжаем поиск (безусловный переход)*/ .L_not_found: movs r0, #0 /* Если символ не найден, возвращаем 0 (перемещаем в r0 значенние 0) */ @ bx lr /* Возврат из функции */ .L_found: @ subs r0, #1 /* Корректируем указатель, так как он был увеличен после загрузки (вычитает 1) */ bx lr /* Возврат из функции */ .size strchr, . - strchr /* Указывает размер функции strchr */ /* Секция константных данных в ПЗУ */ .data .type str1, %object str1: .asciz "Hell" /* Строка, в которой ищем символ */ .type char_to_find, %object char_to_find: .asciz "q" /* Искомый символ */ .end /* Конец файла */