Почему код не разветвляется в BEQ после MOVS - PullRequest
0 голосов
/ 29 ноября 2018

Буду очень признателен, если кто-нибудь сможет мне помочь.

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

1 Ответ

0 голосов
/ 10 декабря 2018

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

Удачи!

...