Почему код не разветвляется на BEQ после MOVS
Буду очень признателен, если кто-нибудь сможет мне помочь.
Почему не происходит ветвление кода при первом чтении BEQ, если сравнивать r2 с r2. По-видимому, окончательное значение в r0 составляет 0X0000001B. Большое спасибо, я очень смущен и расстроен, бегая снова и снова в Кейле.
MOV r0,#1
MOV r1, #0X3
MOV r2,#0X3
MOVS r2,r2
while
BEQ stop
MUL r0,r1,r0
SUBS r2,r2,#1
B while
stop
0 ответов
Ваш код не ветвится, потому что BEQ проверяет, равен ли флаг Z 1.
- MOVS установит Z на 1, если вы MOV r2, #0 или регистр, который имеет значение 0.
Если вы хотите установить флаг Z на 1, вы можете использовать CMP для проверки флагов N и Z. Так будет делать R2-R2 = 0, Z=1
MOV r0,#1 MOV r1, #0X3 MOV r2,#0X3 CMP r2,r2 while BEQ stop MUL r0,r1,r0 SUBS r2,r2,#1 B while stop
Другой, менее эффективный метод - использовать другой регистр с SUBS, устанавливая все флаги (NZCV).
MOV r0,#1 MOV r1, #0X3 MOV r2,#0X3 SUBS r3, r2,r2 while BEQ stop MUL r0,r1,r0 SUBS r2,r2,#1 B while stop
Удачи!