Labs_Shishkina_Marina_ITb-4301/main.S
2024-12-28 15:19:43 +03:00

68 lines
3.1 KiB
ArmAsm
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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