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

person MangoKitty    schedule 29.11.2018    source источник
comment
0x03 не ноль   -  person old_timer    schedule 29.11.2018
comment
Вы думали о том, чтобы сделать CMP или SUBS вместо MOVS?   -  person old_timer    schedule 29.11.2018
comment
посмотрите в документации по своей руке инструкцию mov и определение флага Z.   -  person old_timer    schedule 29.11.2018


Ответы (1)


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

Удачи!

person chocovore17    schedule 10.12.2018