ARM指令的基本格式
ARM指令的基本格式为:
<Opcode> {<Cond>} {S} <Rd> , <Rn> { , <Opcode2> }
其中,< >内的项是必需的,{ }内的项是可选的。
(1)Opcode项
Opcode是指令助记符,即操作码,说明指令需要执行的操作,在指令中是必需的。
(2)Cond项(command)
Cond项表明了指令的执行的条件,每一条ARM指令都可以在规定的条件下执行,每条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码用2个字符表示,这两个字符可以添加至指令助记符的后面,与指令同时使用。当指令的执行条件满足时,指令才被执行,否则指令被忽略。如果在指令后不写条件码,则使用默认条件AL(无条件执行)。
指令的条件码
条 件 码 | 助记符后缀 | 标 志 | 含 义 |
0000 | EQ | Z置位 | 相等equal |
0001 | NE | Z清零 | 不相等not equal |
0010 | CS | C置位 | 无符号数大于或等于Carry Set |
0011 | CC | C清零 | 无符号数小于 |
0100 | MI | N置位 | 负数minus |
0101 | PL | N清零 | 正数或零plus |
0110 | VS | V置位 | 溢出 |
0111 | VC | V清零 | 没有溢出 |
1000 | HI | C置位Z清零 | 无符号数大于high |
1001 | LS | Z置位C清零 | 无符号数小于或等于less |
1010 | GE | N等于V | 带符号数大于或等于 |
1011 | LT | N不等于V | 带符号数小于least |
1100 | GT | Z清零且(N等于V) | 带符号数大于great |
1101 | LE | Z清零或(N不等于V) | 带符号数小于或等于 |
1110 | AL | 忽略 | 无条件执行all |
1111 | NV | never |
|
条件码应用举例:
例:比较两个值大小,并进行相应加1处理,C语言代码为:
if ( a > b ) a++;
else b++;
对应的ARM指令如下(其中R0中保存a 的值,R1中保存b的值):
CMP R0, R1 ; R0与R1比较,做R0-R1的操作
ADDHI R0, R0, #1 ;若R0 > R1, 则R0 = R0 + 1
ADDLS R1, R1, #1 ; 若R0 <= R1, 则R1 = R1 + 1
CMP比较指令,用于把一个寄存器的内容和另一个寄存器的内容或一个立即数进行比较,同时更新CPSR中条件标志位的值。指令将第一操作数减去第二操作数,但不存储结果,只更改条件标志位。
CMP R1, R0 ;做R1-R0的操作。
CMP R1,#10 ;做R1-10的操作。
(3) S项(sign)
S项是条件码设置项,它决定本次指令执行的结果是否影响至CPSR寄存器的相应状态位的值。该项是可选的,使用时影响CPSR,否则不影响CPSR。
(4)Rd项(destination)
Rd是指令中的目标寄存器,它是必需的。根据指令的不同,有些指令中要求Rd必须有R0~R7之间,有些要求Rd必须在R0~R14之间,有些则没有特殊要求。
(5)Rn项
Rn是第一个操作数的寄存器,和Rd一样,不同的指令对其的使用有不同的要求。
(6)Opcode2项
Opcode2项是第二个操作数,在ARM指令中,该操作数有三种形式:立即数形式、寄存器Rm形式和寄存器加移位形式(Rm, shift)。
例如:
SUB R3, R1, #10
SUB R3, R1, R2
SUB R3, R1, R2, LSL #2
SUB R3, R1, R2, LSL R0