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 指令集编码,共四字节
其他…..
条件字段
简介
arm指令可以条件执行指令集编码的31:28是条件执行位[]
Every instruction contains a 4-bit condition code field in bits 31 to 28:31 28 27 0 cond
详细列表:
无符号比较只有高低,没有大小
有符号比较才有大于小于的概念
分支指令
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
- ARM汇编基础
- ARM汇编基础
- arm汇编基础一
- ARM汇编指令基础
- ARM汇编编程基础
- arm 反汇编基础
- ARM汇编基础
- 1.ARM汇编基础
- ARM汇编基础
- ARM汇编基础
- ARM汇编基础
- ARM汇编基础
- ARM汇编基础
- ARM汇编基础
- ARM汇编基础知识点总结
- ARM汇编基础知识点总结
- arm汇编基础(转)
- arm汇编基础(转)
- JAVA界面 Swing
- 人才推荐系统API接口文档
- 三十四、SpringBoot配置属性之Server
- Javascript面向对象(七)——类模式
- jdGrid参数说明
- ARM汇编基础
- Python爬取磁力链信息
- IntelliJ IDEA 中的版本控制介绍(中)
- SQLite实现数据持久化存储小案例之购买商品
- POJ 1276 Cash Machine【多重背包】
- Mybatis(1、核心配置文件、Properties、Settings、typeAliases...)
- JAVA Swing(二)
- bzoj 3251
- 闭包(未写完整)