ARM汇编基础

来源:互联网 发布:字符串压缩 java 编辑:程序博客网 时间:2024/06/06 01:53

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 Ahalf 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 Ahalf 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,rmBXJ  分支和改变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                   Action0000      AND       Logical AND                 Rd:=Rn AND shifter_operand0001      EOR       Logical Exclusive OR        Rd:=Rn EOR shifter_operand0010      SUB       Subtract                    Rd:=Rn -shifter_operand0011      RSB       Reverse Substract           Rd:=shifter_operand - Rn0100      ADD       Add                         Rd:=Rn + shifter_operand0101      ADC       Add with Carry              Rd:=Rn + shifter_operand + Carry Flags0110      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_operand1001      TEQ       Test Equivalence            Update flags after Rn EOR shifter_operand1010      CMP       Compare                     Update flags after Rn - shifter_operand1011      CMN       Compare Negative            Update flags after Rn + shifter_operand1100      ORR       Logical (inclusive) OR      Rd:=Rn OR  shifter_operand1101      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 result6、Dual halfword dual 16 bix x 16bit 32 bit result(16位相乘,32位结果)
Normal 乘法
MUL  将两个寄存器的值相乘,将结果截断为32位,并将结果存储在第三个寄存器中MLA  将两个寄存器的值相乘,将第三个寄存器的值相加,将结果截断为32位,    并将结果存储在第四个寄存器中。这可以用于执行乘法累加操作。正常乘法指令均可以可选地设置N(负)和Z(零)条件码标志。有符号和无符号变体之间没有区别。结果中只有最低有效的32位存储在目标寄存器中,操作数的符号不会影响该值
Long 乘法
SMULLUMULLUMAAL两个变量将两个寄存器的值相乘在一起,并将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 * R1MULS R4,R2,R1               R4 = R2 * R1 ,Set N and Z flagsMLA   R7,R9,R9,R3           R7 = R8 *R9 + R3SMULL R4,R8,R2,R3           R4 = bit 0 to 31 of R2 *R3                            R8  = bit 32 to 63 of R2 *R3UMULL R6,R8 R0,R1           R6 = bit 0 to 32 of R0 * R1                            R8  = bit 31 to 63 of R0 * R1UMLAL 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位的一个数
0 0