ARM体系平台手册笔记04
字节序
32位的大小端问题:大端是数据的高位,在内存的低地址,小端是数据的低位,在内存的低地址
以数据0x12345678举例:
大端模式下:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
78 56 34 12
小端模式下:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
12 34 56 78
64位数据大小端问题,下面用两个表描述一下:
大端模式下:
63 32 31 0
Word at Address A+4 Word at Address A
half W at Addr A+4 half W at Addr A+6 half W at Addr A half W at Addr A+ 2
小端模式下:
Word at Address A+4 Word at Address A
half W at Addr A+6 half W at Addr A+4 half W at Addr A+ 2 half W at Addr A
以数据0x0123456789abcdef举例
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f //内存地址
4567 0123 cdef 89ab
指令集编码
总纲:ARM 指令集编码,共四字节
31 30 29 28 | 27 | 26 | 25 | 24 23 22 21 | 20 | 19 18 17 16 | 15 14 13 12 | 11 10 9 8 | 7 | 6 5 | 4 | 3 2 1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
cond[1] | 0 | 0 | 0 | opcode | S | Rn | Rd | shift amount | shift amount | shift | 0 | Rm |
cond[1] | 0 | 0 | 0 | 1 0 x x | 0 | x x x x | x x x x | x x x x x | x | x x | 0 | x x x x |
cond[1] | 0 | 0 | 0 | opcode | S | Rn | Rd | Rs | 0 | shift | 1 | Rm |
其他…..
条件字段
简介
arm指令可以条件执行指令集编码的31:28是条件执行位[]
Every instruction contains a 4-bit condition code field in bits 31 to 28:
31 28 27 0
cond
详细列表:
Opcode(操作码)[31:28] | Mnemonic extension(助记符) | meaning(含义) | Condition flags state(条件状态) |
---|---|---|---|
0000 | EQ | Equal | Z set |
0001 | NE | Not equal | Z clear |
0010 | CS/HS | Carry set/unsigned high or same | C set |
0011 | CC/LO | Carry clear/unsigned lower | C clear |
0100 | MI | Minus/negative | N set |
0101 | PL | Plus/positive or zero | N clear |
0110 | VS | Overflow | V set |
0111 | VC | No overflow | V clear |
1000 | HI | Unsigned higher | C set and Z clear |
1001 | LS | Unsigned lower or same | C clear or Z set |
1010 | GE | Signed greater than or equal | N set and V set,N clear and V clear(N==V) |
1011 | LT | Signed less than | N set and V clear or N clear and V set (N != V) |
1100 | GT | Signed greater than | Z clear and either N set and V set or N clear and V clear(Z==0,N==V) |
1101 | LE | Signed less than or equal | Z set, or N set and V clear,or N clear and V set (Z==1 or N!=V) |
1110 | AL | Always(uncondtional) |
无符号比较只有高低,没有大小
有符号比较才有大于小于的概念
分支指令
B 前后跳转32MB:
所有的arm处理器分支指令支持条件执行向前跳转或则向后跳转32MB.
BL 调用子程序:
可以通过标准分支指令的变体来执行子程序调用。除了允许分支前进或后退高达32MB,
分支链路(BL)指令保留LR(R14)中分支(返回地址)之后的指令的地址。
BX 带模式切换的跳转:
分支和交换(BX)指令将通用寄存器Rm的内容复制到PC(如MOV PC,Rm指令),
附加功能如果传输值的位[0]为1,则处理器转到Thumb®状态
BLX 带模式切换的子函数调用:
相当于执行mov lr,pc mov pc,rm
BXJ 分支和改变Jazelle State
例子:
B lable branch uncondtional to lable
BCC lable branch to lable if carry flag is clear
BEQ lable branch to lable if zero flag is set
mov PC,#0 r15 = 0 brache to location zero
BL func subroutine call to function
func.
mov pc,lr //r15 = r14,执行完BL之后,返回到BL之后的一条指令
mov lr,pc
ldr pc , = func
数据处理指令
Opcode Mnemonic Operation Action
0000 AND Logical AND Rd:=Rn AND shifter_operand
0001 EOR Logical Exclusive OR Rd:=Rn EOR shifter_operand
0010 SUB Subtract Rd:=Rn -shifter_operand
0011 RSB Reverse Substract Rd:=shifter_operand - Rn
0100 ADD Add Rd:=Rn + shifter_operand
0101 ADC Add with Carry Rd:=Rn + shifter_operand + Carry Flags
0110 SBC Substract with Carry Rd:=Rn -shifter_operand - NOT(Carry)
0111 RSC Reverse Substract with Carry Rd:=shifter_operand - Rn - NOT(Carry)
1000 TST Test Update flags after Rn AND shifter_operand
1001 TEQ Test Equivalence Update flags after Rn EOR shifter_operand
1010 CMP Compare Update flags after Rn - shifter_operand
1011 CMN Compare Negative Update flags after Rn + shifter_operand
1100 ORR Logical (inclusive) OR Rd:=Rn OR shifter_operand
1101 MOV Move Rd:=shifter_operand(no first operand)
1110 BIC Bit Clear Rd:=Rn AND NOT(shifter_operand)
1111 MVN Move Not Rd:=NOT shifter_operand(no first operand)
在两个源操作数中,一个始终是一个寄存器。另一个被称为移位器操作数,并且是立即值或寄存器。
如果第二个操作数是一个寄存器值,它可以对它进行移位
指令编码
有三类操作:
<opcode1>{<cond>}{S} <Rd>,<shifter_operand>
MOV | MVN
<opcode2>{<cond>} <Rn>,<shifter_operand>
CMP | CMN| TST| TEQ
<opcde3>{<cond>} {S} <Rd> <Rn> <shifter_operand>
ADD SUB RSB ADC SBC RSC AND BIC EOR ORR
31 28 27 26 25 24 21 20 19 16 15 12 11 0
cond 0 0 I opcode S Rn Rd shifter_operand
I 位: 区别shifter_operand 是寄存器还是立即数形式
S 位: 表明指令将跟新SPSR的条件标志位
Rn 表明第一个源操作寄存器
Rd 表明目标寄存器
shifter_operand 表明第二个源操作数
乘法指令
乘法类型分类
1、Normal 32 bit x 32 bit ,bottom 32 bit result(32位相乘,低32位结果)
2、Long 32 bit x 32 bit ,64 bit result(32位相乘,64位结果)
3、Halfword 32 bit x 32 bit ,32 bit result(32相乘,32位结果)
4、Word halfword 32 bit x 16bit top 32bit result(32位乘16位,高32位结果)
5、Most significant word (32位相乘,高32位结果)
32 bit x 32bit ,top 32 bit result
6、Dual halfword dual 16 bix x 16bit 32 bit result(16位相乘,32位结果)
Normal 乘法
MUL 将两个寄存器的值相乘,将结果截断为32位,并将结果存储在第三个寄存器中
MLA 将两个寄存器的值相乘,将第三个寄存器的值相加,将结果截断为32位,
并将结果存储在第四个寄存器中。这可以用于执行乘法累加操作。
正常乘法指令均可以可选地设置N(负)和Z(零)条件码标志。有符号和无符号变体之间没有区别。
结果中只有最低有效的32位存储在目标寄存器中,操作数的符号不会影响该值
Long 乘法
SMULL
UMULL
UMAAL
两个变量将两个寄存器的值相乘在一起,并将64位结果存储在第三和第四寄存器中。有符号(SMULL)和无符号(UMULL)变体。
如果任一个或两个源操作数为负,则带符号变量在最高有效32位中产生不同的结果
64位相乘:
有符号:SMLAL
无符号:UMLAL
两个变量将两个寄存器的值相乘,从第三个和第四个寄存器添加64位值,并将64位结果存储回这些寄存器(第三和第四个)。
有符号(SMLAL)和无符号(UMLAL)变体。这些指令执行长乘法和累加
除了UMAAL之外的所有长乘法指令都可以选择设置N(负)和Z(零)条件码标志。 UMAAL不影响任何标志。
Halfword multiply 16 x 16 bit 乘法
SMULxy 将两个半寄存器的16位值相乘在一起,并将有符号的32位结果存储在第三个寄存器中。
SMLAXY 将两个半寄存器的16位值相乘,将来自第三寄存器的32位值相加,并将有符号的32位结果存储在第四寄存器
SMLALxy 将两个半寄存器的16位值相乘在一起,从第三和第四寄存器添加64位值,并将64位结果存储回这些寄存器(第三和第四)。
Word x halfword 乘法
SMULWy 将一个寄存器的32位值与第二寄存器的任一半字的16位值相乘,并将有符号48位结果的前32位存储在第三个寄存器中
SMLAWy 将一个寄存器的32位值与第二个寄存器的任一半字的16位值相乘,提取前32位,从第三个寄存器中添加32位值,并将有符号的32位结果存储在第四个寄存器
高位字乘法 Most significant word multiply
SMMUL 32乘32位,存储64位的结果数据的高32位到第三个寄存器
SMMLA 32 乘32u,将64位结果的高32位数加上一个32位数据,最后结果存储到第四个寄存器
SMMLS 32 位乘32位,从第三个寄存器的32位值中减去32位,并将有符号的32位结果存储在第四个寄存器
双16位半字乘法
SMUAD 将两个寄存器的上半部分的值相乘在一起,将相同的两个寄存器的底部半字的值相乘在一起,将乘积相加,并将32位结果存储在第三个寄存器中
SMUSD 将两个寄存器的上半部分的值相乘在一起,将相同两个寄存器的下半部分的值相乘,从另一个寄存器中减去一个乘积,并将32位结果存储在第三个寄存器
SMLAD 将两个寄存器的32位值相乘,提取前32位,从第三个寄存器的32位值中减去该位,并将有符号的32位结果存储在第四个寄存器中。
SMLSD 将两个寄存器的32位值相乘在一起,提取前32位,从第三个寄存器添加32位值,并将有符号的32位结果存储在第四个寄存器中
SMLALD 将两个寄存器的32位值相乘,提取前32位,从第三个寄存器的32位值中减去32位,并将有符号的32位结果存储在第四个寄存器
SMLSLD 将两个寄存器的32位值相乘,提取前32位,从第三个寄存器的32位值中减去32位,并将有符号的32位结果存储在第四个寄存器
SMUAD,SMLAD和SMLSLD可以在操作中发生溢出时设置Q标志。所有其他指令不影响任何标志
例子:
MUL R4, R2,R1 R4 = R2 * R1
MULS R4,R2,R1 R4 = R2 * R1 ,Set N and Z flags
MLA R7,R9,R9,R3 R7 = R8 *R9 + R3
SMULL R4,R8,R2,R3 R4 = bit 0 to 31 of R2 *R3
R8 = bit 32 to 63 of R2 *R3
UMULL R6,R8 R0,R1 R6 = bit 0 to 32 of R0 * R1
R8 = bit 31 to 63 of R0 * R1
UMLAL R5,R8,R0,R1 R5 = bit 0 to 31 of R0 *R1 + R5
R8 = bit 32 to 63 of R0* R1 + R8
32 位乘以32位,64位的结果再加上64位的一个数