Arm入门学习第五讲,乘丶除丶跳转丶中断丶交换指令

您所在的位置:网站首页 c需要除法符号 Arm入门学习第五讲,乘丶除丶跳转丶中断丶交换指令

Arm入门学习第五讲,乘丶除丶跳转丶中断丶交换指令

2024-01-19 21:31| 来源: 网络整理| 查看: 265

目录Arm入门学习第五讲,乘丶除丶跳转丶中断丶交换指令一丶乘法1.1 乘法指令简介MUL 32位乘法指令MLA 32位乘加指令SMULL 64位有符号乘法指令SMLAL 64位乘加指令UMULL 64位无符号乘法UMLAL 64位无符号乘加指令注意事项二丶除法2.1 除法指令2.2 乘法 除法 减法本质三丶跳转指令3.1 什么是跳转指令以及作用3.2 指令学习B 跳转指令BL 带返回的跳转指令BLX 带返回和状态切换跳转指令BX 带状态切换的跳转指令四丶程序的交换指令4.1 何为交换指令五丶软中断指令SWI5.1 何为软中断

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} ,, 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} ,,, 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} ,,, 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} ,,, SMLAL R0,R1,R2,R3 ;R0 = LOW(R2 * R3) + R0 ;R1 = HIGH(R2 * R3) + R1 UMULL 64位无符号乘法

UMULL与SMULL 指令一样,唯一不同的就是OP1 OP2存储的是无符号数。

UMULL{条件}{S} ,,, UMULL R0,R1,R2,R3; R0 = LOW(R2 * R3) R1 = HIGH(R2 * R3) UMLAL 64位无符号乘加指令

原理与SMLAL指令一样。唯一不同就是OP1 OP2是无符号数

UMLAL {条件}{S} ,,, UMLAL R0,R1,R2,R3; RO = LOW(R2 * R3) + R0 R1 = HIGH(R2 * R3) + R1 注意事项 上述的乘法指令都会影响CPSR中的某些条件标志位。没有一一细说。了解下即可。 二丶除法 2.1 除法指令

​ 有乘法就有除法,除法指令一般就两个。 一个是SDIV 一个是UDIV

有符号除法和无符号除法。

SDIV{条件}{S} ,, UDIV{条件}{S} ,, 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进行调用。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3