为什么在MOVS之后代码不会在BEQ分支

时间:2018-11-29 18:05:40

标签: assembly arm instruction-set microprocessors

如果有人可以帮助我,我真的很感激。

如果将r2与r2进行比较,为什么在第一次读取BEQ时不进行代码分支。显然,r0中的最终值为0X0000001B。非常感谢,我在Keil中一遍又一遍地运行,感到非常困惑和沮丧。

    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 :(得分:0)

您的代码不会分支,因为BEQ测试Z标志是否等于1。

  • 如果MOV r2,#0或值为0的寄存器,MOVS会将Z设置为1。
  • 如果要将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  
    

祝你好运!