Имея опыт программирования, я все еще испытываю трудности с концепциями ассемблера.Все онлайн-уроки, которые я нашел до сих пор, несколько полезны, но я перехожу с урока на урок, чтобы собрать вещи воедино.В любом случае, у меня есть несколько концептуальных вопросов, касающихся следующей программы сборки ARM, и я ценю любую помощь и указатели.
@converts a lowercase letter to an uppercase letter
.global _start
_start:
MOV R7, #3
MOV R0, #0
MOV R2, #1
LDR R1, =character
SWI 0
_uppercase:
LDR R1, =character
LDR R0, [R1]
BIC R0, R0, #32
STR R0, [R1]
_write:
MOV R7, #4
MOV R0, #1
MOV R2, #1
SWI 0
end:
MOV R7, #1
SWI 0
.data
character:
.ascii " "
- Я понимаю, что такое системные вызовы, такие как чтение с клавиатуры или вывод на экран, но чтоопределяет, какой регистр отвечает за какие системные вызовы и как мне узнать, какие значения необходимо передать в эти регистры?
- В этом примере регистр R0 используется для системного вызова в строке 6 для получения ввода изклавиатуры, а затем снова используется в строке 13, чтобы загрузить адрес регистра R1 в себя.Что происходит с исходным значением / системным вызовом из строки 6?Каждая строка выполняется построчно во время выполнения?Где хранится информация, которую я собираюсь взять с клавиатуры (строка 6)?
- Как и в вопросе 2, я храню адрес слова для регистрации R0 в строке 15, но создаю системувызов в строке 19 для вывода в память, используя тот же регистр.Что случилось с адресом памяти, который был сохранен в регистре R0 из строки 15?
- Почему каждый раздел метки должен иметь SWI 0?Почему раздел _uppercase не имеет SWI 0?
- Почему для завершения программы требуется системный вызов (строка 24) перед SWI 0?
Заранее спасибо за ответы иЯ надеюсь, что этот пост поможет другим понять некоторые концепции ARM.