我试图弄清楚下面这段代码是否允许汇编程序分支到标签' 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语句中进行比较的内容。
感谢。
答案 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
且您添加200
(C8h
),情况确实如此:
FFFFFF38
C8 +
--------
(1)00000000 =