Мой ASM немного ржавый, поэтому, пожалуйста, не гнилые помидоры. Предполагая, что это начинается в sub_FFFF7B38
:
Команда PUSH {LR}
сохраняет регистр связи, который является специальным регистром, который содержит адрес возврата во время вызова подпрограммы.
ADDS
устанавливает флаги (как CMN
). Также ADDS R2, R0, #0
добавляет R0
к 0 и сохраняет в R2. (Исправление от Чарльза в комментариях)
LDRB R3, [R2]
загружает содержимое R2
в основную память вместо регистра, на который ссылается R3
. LDRB
загружает только один байт. Три неиспользуемых байта в слове обнуляются при загрузке. В основном, получение R2
из регистров и в сохранности (возможно).
CMP R3, #0
выполняет вычитание между двумя операндами и устанавливает флаги регистра, но не сохраняет результат. Эти флаги ведут к ...
BEQ loc_FFFF7B521
, что означает «Если предыдущее сравнение было равным, перейдите к loc_FFFF7B521» или if(R3 == 0) {goto loc_FFFF7B521;}
Так что если R3
не равен нулю, то команда SUBS R1, #1
вычитает единицу из R1
и устанавливает флаг.
BCC loc_FFFF7B52
заставит выполнение перейти к loc_FFFF7B52
, если установлен флаг переноса.
(отрывок)
Наконец, POP {LR}
восстанавливает предыдущий адрес возврата, который содержался в регистре ссылок до выполнения этого кода.
Редактировать - Пока я был в машине, творог объяснил, о чем я думал, когда пытался выписать свой ответ, и у меня не хватило времени.