Arm入门学习第五讲,乘丶除丶跳转丶中断丶交换指令
Arm入门学习第五讲,乘丶除丶跳转丶中断丶交换指令
一丶乘法
1.1 乘法指令简介
ARM微处理器支持的乘法指令与乘加指令共有六条,可分为运算结果为32位和运算结果位64位
的两类,与数据处理指令不同,指令中所有的操作数丶目的寄存器必须为 通用寄存器 不能对操作数使用立即数 或被移位的寄存器 同时,目的寄存器和操作数1必须是不同的寄存器。
指令分为如下六条
- MUL: 32位乘法指令
- MLA: 32位的乘加指令
- SMULL: 64位有符号数乘法指令
- SMLAL: 64位有符号数乘加指令
- UMULL : 64位无符号乘法指令
- UMLAL: 64位无符号数乘加指令
MUL 32位乘法指令
MUL指令是将操作数1 与操作数2进行乘法运算,并且把结果放置到目的寄存器中。同时可以根据运算结果来设置CPSR中相应的条件标志位。 操作数1与操作数2均为32位的有符号数或者无符号数。
MUL{条件}{S} <DEST>,<OP1>,<OP2>
MUL R0,R1,R2 ;RO = R1 x R2
MULS R0,R1,R2 ;R0 = R1 x R2 同时设置CPSR中的相关条件标志位
MLA 32位乘加指令
MLA指令 是将操作数1 乘 操作数2. 得出的乘积的结果 加上操作数3. 的出来的结果放到目的寄存器中。同时设置CPSR。 其中操作数1 操作数2 均为32位的有符号或者无符号数。 操作数3不限制必须是寄存器。
MLA{条件}{S} <DEST>,<OP1>,<OP2>,<OP3>
MLA RO,R1,R2,R3; R0 = R1 * R2 + R3
MLAS R0,R1,R2,R3 ; RO = R1 * R2 + R3 并且设置CPSR
SMULL 64位有符号乘法指令
SMULL指令 是将操作数1 余操作数2进行乘法运算,并且讲乘法的低32位放到目的寄存器中的low中。高32位放到目的寄存器中high中。 op1 op2均为32位有符号数。 同理设置CPSR
SMULL{条件}{S} <DEST_LOW>,<DEST_HIGH>,<OP1>,<OP2>
SMULL R0,R1, R2,R3; R0 = low(R2 * R3) R1 = high(R2 * R3)
SMLAL 64位乘加指令
SMLAL 指令完成 op1 * op2的运算, 并且吧结果的低32位同目的寄存器low中的值相加后在放到low寄存器中。 就是比SMULL多了一步。多了一步相加的操作。SMULL是直接低位放low 高位放high。 这个指令是先加一次在放。 low = 结果低位 + low high = 结果高位+high.
SMLAL{条件}{S} <DEST_LOW>,<DEST_HIGH>,<OP1>,<OP2>
SMLAL R0,R1,R2,R3
;R0 = LOW(R2 * R3) + R0
;R1 = HIGH(R2 * R3) + R1
UMULL 64位无符号乘法
UMULL与SMULL 指令一样,唯一不同的就是OP1 OP2存储的是无符号数。
UMULL{条件}{S} <DEST_LOW>,<DEST_HIGH>,<OP1>,<OP2>
UMULL R0,R1,R2,R3;
R0 = LOW(R2 * R3)
R1 = HIGH(R2 * R3)
UMLAL 64位无符号乘加指令
原理与SMLAL指令一样。唯一不同就是OP1 OP2是无符号数
UMLAL {条件}{S} <DEST_LOW>,<DEST_HIGH>,<OP1>,<OP2>
UMLAL R0,R1,R2,R3;
RO = LOW(R2 * R3) + R0
R1 = HIGH(R2 * R3) + R1
注意事项
上述的乘法指令都会影响CPSR中的某些条件标志位。没有一一细说。了解下即可。
二丶除法
2.1 除法指令
有乘法就有除法,除法指令一般就两个。 一个是SDIV 一个是UDIV
有符号除法和无符号除法。
SDIV{条件}{S} <dest>,<op1>,<op2>
UDIV{条件}{S} <dest>,<op1>,<op2>
2.2 乘法 除法 减法本质
在计算机中是没有乘法 减法 除法的。 最后都是转为加减的。而减法又可以转化为加法。所以最终只有加法运算。
5-3: 可以看成 5 + -3
5*3: 可以看成 5 + 5 + 5
5*3: 可以看成5-3 2-3 减不够 所以商位1,余数位2
2、3:2-3 商位0.余数位2
三丶跳转指令
3.1 什么是跳转指令以及作用
跳转指令用于实现程序流程的跳转,在ARM程序中有两种方式可以实现程序跳转
- 使用专门的跳转指令;
- 直接向程序计数器PC写入跳转的地址值;
通过向程序计数器PC(R15)写入跳转的地址值,可以实现在4GB的地址空间中任意跳转,在跳转之前结合使用 MOV LR,PC 等类似指令。可以保存将来的返回地址的值从而实现在4GB的先行地址空间的子程序的调用。
ARM指令集中的跳转指令可以完成从当前指令 向前 或者向后的32MB的地址空间的跳转,包括以下四条指令。
- B : 跳转指令。
- BL: 带返回的跳转指令。
- BLX: 待返回和状态切换的跳转指令
- BX: 带状态切换的跳转指令。
3.2 指令学习
B 跳转指令
B指令是最简单的跳转指令。一旦遇到一个B指令,ARM处理器将立即进行跳转,跳转到给定的目标地址,从哪里继续执行(类似于inter的jmp)。注意,存储在跳转指令中的实际值是相对当前PC值的一个偏移量(跟inter相似,存储的是offset不是绝对地址)它的值由汇编器计算,(相对寻址可以找到答案) 他是一个24位有符号数,左移两位后扩展为32位,表示的有效偏移为26位,也就是32MB地址空间。
B{条件} 目标地址
B lable;
CMP R1,#0
lable:
BEQ lable
BL 带返回的跳转指令
BL跟B一样,唯一不同就是在跳转之前会在R14(LR)寄存器中保存PC(R15)寄存器的内容 因此我们可以通过将R14的内容重新加载到PC中来进行返回到原地址处执行。如果学过inter 86汇编的人应该可以理解,BL其实跟Call类似,Call的本质是 push +jmp。 唯一不同的就是函数返回的时候是用RET指令来进行返回,而这里是直接修改PC(EIP)进行返回。
BL{条件} 目标地址
BL lable;
CMP R0,#1
MOVEQ R0,R1
lable:
MOVS R1,#2
;;MOV PC(r15),LR(r14)
BLX 带返回和状态切换跳转指令
首先BLX是从ARM指令集跳转到指令中的所指定的目标地址,并将处理器的工作状态 由ARM切换成Thumb状态 该指令和BL指令一样会将PC保存到R14寄存器中。同时子程序返回还是将PC修改为原值即可。
BL{条件} 目标地址
BX 带状态切换的跳转指令
BX指令跟B指令一样都是跳转到目标地址,唯一不同就是目标地址处的指令可以是ARM指令,也可以是Thumb指令。
BX{条件} 目标地址
四丶程序的交换指令
4.1 何为交换指令
交换指令就是把内存中的值给寄存器, 然后再把寄存器的值给内存。
主要指令为:
- SWP RD,RM,[RN] 将Rn内存的值给RD寄存器 将RM寄存器的值设置到RN内存中
- SWPB R1,R2,[R0] 带B后缀是一个字节的意思,就是互相交换一个字节。
SWP R1,R1,[R0] 将R0内存中的值给R1,然后把R1的值给R0 交换R1跟R0
五丶软中断指令SWI
5.1 何为软中断
相信学过16位inter汇编的应该知道,windows下之前调用函数都可以通过int 21 等指令来进行函数的调用,这就是中断的意思。
在ARM中通用也有类似指令,它是将用户模式和其它模式 切换到管理模式。CPSR保存在管理模式的SPSR中。
- SWI 指令,用于调用软中断
例子:
SWI 0X55; 调用0x55号软中断
MOV R0,#0X34
SWI 0X18 ;子功能号为0x34 然后调用0x18软中断
MOV R0,#0X18 18号软中断
MOV R1,#0X34 子功能号0x34
SWI 0 切换,0会被忽略,他会自己去读取R0 R1进行调用。