Arm入门学习第五讲,乘丶除丶跳转丶中断丶交换指令 |
您所在的位置:网站首页 › c需要除法符号 › Arm入门学习第五讲,乘丶除丶跳转丶中断丶交换指令 |
目录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 |