ARM汇编基础

本文主要介绍了ARM体系平台的手册笔记,重点讲解了字节序、指令集编码、条件字段、分支指令以及各种数据处理指令,包括不同类型的乘法运算,如Normal乘法、Long乘法、64位相乘等,深入探讨了ARM指令如何处理数据和执行条件。
摘要由CSDN通过智能技术生成

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 2827262524 23 22 212019 18 17 1615 14 13 1211 10 9 876 543 2 1
cond[1]000opcodeSRnRdshift amountshift amountshift0Rm
cond[1]0001 0 x x0x x x xx x x xx x x x xxx x0x x x x
cond[1]000opcodeSRnRdRs0shift1Rm

其他…..

条件字段

简介
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(条件状态)
0000EQEqualZ set
0001NENot equalZ clear
0010CS/HSCarry set/unsigned high or sameC set
0011CC/LOCarry clear/unsigned lowerC clear
0100MIMinus/negativeN set
0101PLPlus/positive or zeroN clear
0110VSOverflowV set
0111VCNo overflowV clear
1000HIUnsigned higherC set and Z clear
1001LSUnsigned lower or sameC clear or Z set
1010GESigned greater than or equalN set and V set,N clear and V clear(N==V)
1011LTSigned less thanN set and V clear or N clear and V set (N != V)
1100GTSigned greater thanZ clear and either N set and V set or N clear and V clear(Z==0,N==V)
1101LESigned less than or equalZ set, or N set and V clear,or N clear and V set (Z==1 or N!=V)
1110ALAlways(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位的一个数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值