Это изменило порядок вашего кода вашего кода на что-то вроде:
GOTO A
B: Counter++;
A: if (Counter <= 249) GOTO B
Вот переупорядоченная сборка с моими комментариями:
001B08 370003 BRA 0x1B10 // GOTO A
B: Counter++;
001B0A 90406E MOV.B [W14+6], W0 // Copy Counter to W0
001B0C E84000 INC.B W0, W0 // Increment W0
001B0E 984760 MOV.B W0, [W14+6] // Put W0 back in Counter
A: if (Counter <= 249) GOTO B
001B10 90406E MOV.B [W14+6], W0 // Get counter to W0
001B12 404FE7 ADD.B W0, #0x7, [W15] // Add 7 in modulo 256.
// This is the same as subtracting 249
001B14 36FFFA BRA LEU, 0x1B0A // if result <= 0 GOTO B
// else just drop through to code below
BRA LEU
является ключомзацикливание инструкции здесь.Это означает BRA nch, если L ess than или E qual U nsigned.Это означает, что ветвь берется, если C = 0 или Z = 1, как было оставлено предыдущей инструкцией.
Подробности, которые легко запутаться, это то, что C
, это carry флаг после добавления.Но если, как в этом примере, мы хотим рассматривать ADD
как вычитание, тогда вы должны рассматривать not(C)
как займ .Вот почему BRA LEU
принимает ветвь, если C = 0.