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进行调用。
posted @ 2021-07-04 22:28  Android_IBinary  阅读(1211)  评论(0编辑  收藏  举报