Part 6:条件状态和分支
在探讨CPSR时我们已经接触了条件状态。我们通过跳转(分支)或者一些只有满足特定条件才执行的指令来控制程序在运行时的执行流。通过CPSR寄存器中的特定bit位来表示条件状态。这些位根据指令每次执行的结果而不断变化。例如,比较运算时如果两个数相等,那么就置CPSR中的Zero位(Z=1),实际上是因为:a - b = 0,这种情况下就是相等状态。如果第一个数大,那么就是大于状态。如果第二个数大,就是小于状态。除此之外,还有小于等于、大于等于等等。
下面的表格列出了可用的条件状态码,描述和标志位:
在下面代码片段中看一下执行条件加法时的实际用法L:
.global main
main:
mov r0, #2 /* 初始化变量 */
cmp r0, #3 /* 将R0中的值与3比较,负数位置1 */
addlt r0, r0, #1 /* 如果上一条比较结果是小于(查看CPSR),则将R0加1 */
cmp r0, #3 /* 将R0中的值再与3比较, 零位置1,同时负数位重置为0 */
addlt r0, r0, #1 /* 如果上一条比较结果是小于(查看CPSR),则将R0加1 */
bx lr
第一条cmp
指令结果导致CPSR
中的负数位置1(2- 3 = -1
)意思是R0
小于R3
。因为满足小于条件(CPSR
中的溢出位不等于负数位V != N
)所以接下来的ADDLT
指令执行。在执行下一条cmp
指令时,R0 = 3
。所以清除负数位(3 - 3 = 0
,负数位清零),零位置位(Z = 1
)。现在溢出位是0,负数位是0ÿ