Почему код не разветвляется на 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  
    

Удачи!

Другие вопросы по тегам