GBA ASM - День 2: Немного информации об ассемблере ARM — Архив WASM.RU

Все статьи

GBA ASM - День 2: Немного информации об ассемблере ARM — Архив WASM.RU

ARM - это компания, которая делает процессор GBA. Процессоры ARM являются RISC-процессорами (в отличии от процессоров INTEL). RISC расшифровывается как Reduced Instruction Set Computers (CISC - Complex ...). Хотя в этих процессорах не так много инструкций (что хорошо), инструкции ARM (а может и других RISC-процессоров, я не знаю) имеют много различных назначений и комбинаций, что делает RISC-процессорами таким могущественными, каким они являются.

Регистры

Я не знаю о других процессорах ARM, но у того, который используется в GBA, 16 регистров и в отличии от процессоров Intel (и других), все регистры можно спокойно использовать (как правило). Регистры следующие:

r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15

Вау! Много! Объясняю по-порядку.

ro: Делайте, что хотите!

r2 to r12 : то же самое

r13 : На некоторых ARM-системах r13 - это указатель на стек (SP в процессорах INTEL). Я не уверен, играет ли r13 ту же роль в GBA, я могу только предупредить, чтобы вы были осторожны с ним, когда работаете со стеком.

r14 : Содержит адрес возврата для вызываемых процедур. Если вы их не используете, тогда можете делать с ним всё, что хотите.

r15 : Program Counter и флаги, так же как IP (Instruction Pointer в Intel). Он отличается от Intel'овского регистра IP тем, что у вас есть свободный доступ к нему, так же как и к любому другому регистру, но учтите, что его изменение приведет к тому, что управление будет передано на другой участок кода, а флаги изменятся.

Давайте проделаем небольшое математическое упражнение... 16 минус 3 (как правило) даёт нам 13 регистров. Не правда ли, это круто? Успокойтесь :).

Сейчас вы можете спросить, чем же на самом деле являются регистры. Регистры - это специальные участки памяти, которые являются частью процессора и не имеют действительного адреса, а известны только по своим именам. Регистры 32-х битны. Почти всё в любом ассемблерном языке использует регистры, поэтому вы должны знать их также хорошо, как своих родственников.

Инструкции ассемблера ARM

Во-первых, я хочу начать с того, что по моему мнению тот, кто придумал ассемблер ARM, является гением.

Во-вторых, я хочу представить моего хорошего друга CMP. Скажите ему привет, и возможно, только возможно, он станет и вашим другом. CMP расшифровывается как CoMPare (сравнить). Эта инструкция может сравнить регистр и число, регистр и регистр или регистр и ячейку памяти. Затем, после сравнивания CMP устанавливает флаги статуса, которые сообщают вам результат сравнения. Как вы можете вспомнить, регистр r15 содержит флаги. Они сообщают результат сравнения. Инструкция CMP была специально создана для установки значения этих флагов и ни для чего более.

Флаги могут содержать следующие состояния:

EQ EQual / Равно
NE Not Equal / Не равно
VS oVerflow Set / Установка переполнения
VC oVerflow Clear / Очищение переполнения
HI HIgher / Выше
LS Lower or the Same / Ниже или то же самое
PL PLus / Плюс
MI MInus / Минус
CS Carry Set / Установка переноса
CC Carry Clear / Очищение переноса
GE Greater than or Equal / Больше или равно
GT Greater Than / Больше
LE Less than or Equal / Меньше или равно
LT Less Than / Меньше
Z is Zero / Ноль 
NZ is not Zero / Не ноль

Эти состояния играют очень важную роль в ассемблере ARM.

ПРИМЕЧАНИЕ: флаги только сохраняют условия (Равно, Меньше и так далее). Больше они ничем не важны.

Суффиксы условий

Вы уже видели инструкцию B (Branch). Инструкция B делает то, что называется безусловным переходом (как GoTo в Basic или JMP в ассемблере INTEL). Но она может иметь суффикс (один из тех, что были перечислены выше), тогда она проверяет, соответствует ли ему состояние флагов. Если нет, то инструкция перехода просто не выполняется. Поэтому, если вы хотите проверить, равен ли регистр r0 регистру r4, а затем перейти к метке под названием label34, то вам необходимо написать следующий код:

CMP r0, r4     ; Комментарии в ассемблере идут после точки с запятой (;)
BEQ label34    ; B - инструкция перехода, а EQ - суффикс, означающий 
               ; "Если Равно"

ПРИМЕЧАНИЕ : В Goldroad Assembler метки не нужно сопровождать (:), и кроме имени метки в строке ничего не должно быть.

ПРИМЕЧАНИЕ II: Писать CMP и BEQ заглавными буквами не обязательно, это просто для того, чтобы вам было более понятно.

Теперь вы знаете как делать переход в зависимости от состояния флагов, но что вы не знаете, так это то, что вы можете делать в зависимости от состояния флагов всё, что угодно, просто добавьте к любой инструкции нужный суффикс!

Также вам не обязательно использовать CMP для установления состояния флагов. Если вы хотите, чтобы, например, инструкция SUB (Subtract) устанавливала флаги, добавьте суффикс 'S' к инструкции (расшифровывается как 'Set flags'). Это полезно, если вы не хотите устанавливать состояние флагов лишней инструкцией CMP, поэтому сделать это и совершить переход, если результат был равен нулю, можно следующим образом:

SUBS r0,r1,0x0FF   ; Устанавливает флаги согласно результату выполнения 
                   ; инструкции
ldrZ r0,=0x0FFFF   ; Загрузит в регистр r0 0x0FFFF только, если состояние 
                     флагов равно Нулю.

Обзор

Сегодня мы изучили (ещё немного) о регистрах. Мы также узнали о гибкости инструкций ARM, которые могут выполняться (или не выполняться) в зависимости от состояния флагов. Мы узнали много сегодня.

Завтра иы используем приобретённое сегодня знание ассемблера ARM для того, чтобы вывести картинку на экран GBA.

- Нечто невозможное является таковым только до той поры, пока оно не становится возможным /Jean-Luc Picard, Capt. , USS Enterprise/.

2002-2013 (c) wasm.ru