ARM汇编语言:此条件语句是否会分支标记" dest"?

时间:2016-10-20 01:49:05

标签: assembly arm

我试图弄清楚下面这段代码是否允许汇编程序分支到标签' dest'。

LDR  R1, =value
LDR  R2, [R1]
ADDS R2, R2, #200
STR  R2, [R1]
BEQ  dest

其中value最初包含0xFFFFFF38。我理解' s'在ADD指令的末尾将添加十进制值200和R2,并将结果置于R2,同时也设置APSR标志,但我不一定确定在BEQ语句中进行比较的内容。

感谢。

1 个答案:

答案 0 :(得分:2)

许多汇编语言都有一个BEQ类型的指令,它经常遵循一些比较指令,如CMP(因此"等于")。

但是,因为比较通常是减去但却丢掉结果"如果设置了标志,则BEQ将简单地分支。

换句话说,你倾向于看到的东西就像(在一些神秘的伪汇编代码中):

; basically: for (reg1 = 0; reg1 != reg2; reg1++)
    load reg1, 0
startloop:
    cmp  reg1, reg2   ; pretend subtract reg1 - reg2
    beq  endloop      ; zero flag set means they were equal
    : :
    inc  reg1
    bra  startloop
endloop:

但是,您不仅限于只是比较,可以使用任何设置相关标志的内容,例如:

    load reg1, [memaddr]  ; loading zero from memory
    dec  reg3             ; decrementing if we go 1 -> 0

在您的特定情况下,STR实际上并未更改条件标志,它是影响分支的ADDS(实际上,它是S }后缀,指定这个,因为常规ADD没有。)

因此,如果您的ADDS R2, R2, #200(最终结果放入R2)的结果为零,那么,最后一行将是分支。

如果初始值为FFFFFF38h且您添加200C8h),情况确实如此:

   FFFFFF38
         C8 +
   --------
(1)00000000 =