当前位置: 首页 > news >正文

指令系统3(算数运算指令)

一.加法指令(ADD)

用于执行 16 位或 32 位的加法运算。

  • 指令格式及功能:
    • ADD Rd, Rm:将寄存器RdRm的值相加,结果存回Rd,即Rd = Rd + Rm
    • ADD Rd, Rn, Rm:把寄存器RnRm的值相加,结果存入RdRd = Rn + Rm 。
    • ADD Rd, #immimm为 8 位或 16 位立即数,将Rd的值与立即数相加,Rd = Rd + imm。例如ADD R0, #0x12,执行后R0 = R0 + 0x12 。
    • ADD.W Rd, Rn, Rm:显式指定为 32 位指令,Rd = Rn + Rm 。
  • 标志位影响:16 位加法会自动更新 APSR(应用程序状态寄存器)中的标志位;使用W指定 32 位指令时,通过S后缀控制对 APSR 的更新,如ADD.W R0, R1, R2不更新标志位,ADDS.W R0, R1, R2更新标志位。

二.带进位加法指令(ADC)

进行 16 位或 32 位带进位的加法运算。

  • 指令格式及功能:
    • ADC Rd, Rn:将RdRn的值与进位标志C相加,结果存回Rd,即Rd = Rd + Rn + C 。
    • ADC Rd, #immimm为 12 位立即数,Rd = Rd + imm + C 。
    • ADC Rd, Rn, RmRd = Rn + Rm + C 。例如ADC.W R0, R1, R2,执行R0 = R1 + R2 + C 。
  • 标志位影响:与 ADD 指令类似,ADC.W R0, R1, R2不更新标志位,ADCS.W R0, R1, R2更新标志位。

三.64 位加法举例

  • 计算两个 64 位数的和,假设R0R1为被加数,R2R3为加数。
    • 方法一(16位):
      MOV R0, #1
      LDR R1, =0X80000001
      MOV R2, #2
      LDR R3, =0XFFFF0001
      ADD R1, R3
      ADC R0, R2
      
    • 方法二(32位):
      MOV R0, #1
      LDR R1, =0X80000001
      MOV R2, #2
      LDR R3, =0XFFFF0001
      ADDS.W R1, R1, R3
      ADC.W R0, R0, R2
      
    • 运行结果:R1 = 0X7FFF0002R0 = 0X00000003 。

四.减法指令(SUB)

  • 实现 16 位或 32 位的减法运算。
    • 指令格式及功能:
      • SUB Rd, Rn:从Rd中减去Rn的值,结果存回Rd,即Rd = Rd - Rn
      • SUB Rd, #immimm为 8 位或 16 位,Rd = Rd - imm。例如SUB R0, #0xf1,执行后R0 = R0 - 0xf1 。
      • SUB Rd, Rn, Rm:用Rn减去Rm的值,结果存入RdRd = Rn - Rm 。
      • SUB.W Rd, Rn, Rm:32 位减法指令,Rd = Rn - Rm 。
    • 标志位影响:与 ADD 指令类似,SUB.W R0, R1, R2不更新标志位,SUBS.W R0, R1, R2更新标志位。

五.带借位减法指令(SBC)

  • 执行 16 位或 32 位带借位的减法运算。
    • 指令格式及功能:
      • SBC Rd, RnRd = Rd - Rn - (~C),其中~C表示进位标志C的取反。
      • SBC Rd, #immimm为 8 位或 16 位,Rd = Rd - imm - (~C) 。
      • SBC Rd, Rn, RmRd = Rn - Rm - (~C) 。例如SBC.W R0, R1, R2R0 = R1 - R2 - (~C) 。
    • 标志位影响:与 ADD 指令类似,SBC.W R0, R1, R2不更新标志位,SBCS.W R0, R1, R2更新标志位。

六.逆向减法指令(RSB)

  • 指令格式及功能:
    • RSB.W Rd, Rn, #imm12:用 12 位立即数imm12减去Rn的值,结果存入Rd,即Rd = imm12 - Rn。例如RSB.W R8, R6, #240,执行后R8 = 240 - R6 。
    • RSB.W Rd, Rn, Rm:用Rm减去Rn的值,结果存入RdRd = Rm - Rn 。

七.64 位减法举例

  • 计算两个 64 位数的差,假设R0R1为被减数,R2R3为减数。
    • 方法一(16位):
      MOV R0, #0
      MOV R1, #1
      MOV R2, #0
      MOV R3, #2
      SUB R1, R3
      SBC R0, R2
      
    • 方法二(32位):
      MOV R0, #0
      MOV R1, #1
      MOV R2, #0
      MOV R3, #2
      SUBS.W R1, R1, R3
      SBC.W R0, R0, R2
      
    • 运行结果:R1 = 0XFFFFFFFER0 = 0XFFFFFFFE 。

八.比较指令(CMP)

  • 比较两个操作数的值,影响 APSR 标志位。
    • 指令格式及功能:
      • CMP Rd, Rn:将RdRn相减,但不存储结果,仅影响 APSR 标志位。
      • CMP Rd, #immimm为 8 位或 16 位,将Rd与立即数相减,影响 APSR 标志位。例如CMP R0, R1,用于比较R0R1的值,影响 APSR 标志位。

九.乘法指令(MUL)

  • 执行乘法运算。
    • 指令格式及功能:
      MOV R1, #3
      MOV R3, #2
      MUL.W R1, R1, R3
      
       

      执行后R1 = 6 。

      • MUL Rd, Rm:将RdRm相乘,结果存回Rd,即Rd = Rd * Rm
      • MUL.W Rd, Rn, Rm:将RnRm相乘,结果存入RdRd = Rn * Rm 。 例如:

十.带符号的 64 位乘法

  • 指令格式:SMULL RL, RH, Rm, Rn(RH, RL) = Rm * Rn,将RmRn带符号相乘,结果的低 32 位存于RL,高 32 位存于RH
  • 示例:
    MOV R0, #1
    MOV R1, #-2
    SMULL R2, R3, R0, R1
    

    运行结果:R2 = 0XFFFFFFFER3 = 0XFFFFFFFE 。

十一.无符号的 64 位乘法

  • 指令格式:UMULL RL, RH, Rm, Rn(RH, RL) = Rm * Rn,将RmRn无符号相乘,结果的低 32 位存于RL,高 32 位存于RH
  • 示例:
    MOV R0, #1
    MOV R1, #-2
    UMULL R2, R3, R0, R1
    

    运行结果:R2 = 0XFFFFFFFER3 = 0X00000000 。

十二.乘加指令(MLA)与乘减指令(MLS)

  • 指令格式及功能:
    • MLA Rd, Rm, Rn, Ra:先计算RmRn的乘积,再加上Ra,结果存入Rd,即Rd = Ra + Rm * Rn
    • MLS Rd, Rm, Rn, Ra:先计算RmRn的乘积,再用Ra减去该乘积,结果存入RdRd = Ra - Rm * Rn 。
  • 示例:计算x * y + z 。
    MOV R0, #x
    MOV R1, #y
    MOV R2, #z
    MLA R3, R0, R1, R2
    

十三.除法指令

  • 指令格式及功能:
    • SDIV Rd, Rn, Rm:执行带符号除法,Rd = Rn / Rm 。
    • UDIV Rd, Rn, Rm:执行无符号除法,Rd = Rn / Rm ,余数被丢弃。
  • 异常处理:为捕捉被零除的非法操作,可在 NVIC(嵌套向量中断控制器)的配置控制寄存器中置位DIVBZERO位。若出现被零除情况,会引发用法 fault 异常;若无处理措施,除数为零时Rd将被清零。
  • 示例:
    MOV R0, #3
    MOV R1, #2
    UDIV R2, R0, R1
    

    运行结果:R2 = 0X00000001 。

相关文章:

  • 算法题(102):八皇后
  • 剑指 Offer II 113. 课程顺序
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring MVC 的核心组件:DispatcherServlet 的工作原理
  • 投资日记_道氏理论技术分析
  • 互联网it常用抓包工具说明
  • 洛谷 P10108 [GESP202312 六级] 闯关游戏 题解
  • 【Linux】——环境变量与进程地址空间
  • ocp考试有判断题吗?多少分及格?
  • 【C++】理解 C++ 中的完美转发(Perfect Forwarding)
  • 人工智能开发中的常见问题与避坑指南
  • 列举常见算法的时间复杂度与空间复杂度
  • 【Java/数据结构】队列(Quque)
  • 【DeepSeek学C++】 effective modern C++第33条款
  • Xcode16.1使用MonkeyDev运行Tiktok报错分析
  • 分享一个精灵图生成和拆分的实现
  • 可以高效记录工作生活琐事的提醒APP工具
  • MySQL教程 基本知识(基本原理和标准语言)
  • 回溯-组合总和
  • Three.js贴图技巧:优化性能与效果
  • 算法-深度优先搜索DFS
  • 世卫大会连续9年拒绝涉台提案
  • 两名游客刻划八达岭长城,被拘5日罚200元
  • 广东进入“倒水模式”,珠江防总、珠江委已启动Ⅳ级应急响应
  • 美国前总统拜登确诊前列腺癌
  • 推开“房间”的门:一部“生命存在的舞台” 史
  • 跨越三十年友情,61岁余隆和60岁齐默尔曼在上海再度合作