68 lines
3.1 KiB
ArmAsm
68 lines
3.1 KiB
ArmAsm
.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 /* Конец файла */
|