ARM汇编之乘法指令

ARM汇编之乘法指令

前言

首先,请问大家几个小小问题,你清楚:

  • 乘法指令有哪些种类呢?
  • ARM乘法指令具体的使用场景又有哪些?

今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:

在这里插入图片描述


正文

ARM存在两类乘法指令,一个是32位乘法指令,得到的最终结果均为32位。另一个则是64位乘法指令,得到的结果都是64位。

32位乘法指令

MUL指令:

MUL指令的作用如下:

  • 实现两个32位数(可以是有符号数,也可以是无符号数)的乘法运算,并将结果最终存入一个32位的寄存器中;
  • 同时还会根据运算结果设置CPSR寄存器中相应的条件标志位;
  • 由于两个32位数相乘结果为64位,而MUL指令仅仅保留了64位结果的低32位,所以无论对于有符号数还是无符号数的操作数而言,MUL指令执行的结果都是相同的。

MUL指令格式与实例展示如下:

在这里插入图片描述

图1 MUL指令格式

MLA指令

MLA指令作用如下:

  • 实现两个32位(可以为无符号数,也可为有符号数)的乘积,再加上第3个操作数,并将结果保存到一个32位的寄存器中;
  • 同时根据运算结果设置CPSR寄存器中相应的条件标志位;

MLA指令格式与实例展示如下:

在这里插入图片描述

图2 MLA指令格式

64位乘法指令

SMULL指令

SMULL指令作用如下:

  • 实现两个32位的有符号数的乘积,将乘积结果的高32位存放到一个32位寄存器的中,乘积结果的低32位存放到另一个32位的寄存器中;
  • 根据运算结果设置CPSR寄存器中的相应条件标志位,考虑到指令执行的效率,指令中的所有操作数都放在寄存器中。

SMULL指令格式与实例展示如下:
在这里插入图片描述

图3 SMULL指令格式

SMLAL指令

SMLAL指令的作用如下:

  • 实现将两个32位的有符号数的64位乘积结果与和中的64位数相加,加法结果的高32位存放到一个32位的寄存器中,加法结果的低32位数存放到另一个32位的中;
  • 同时根据运算结果设置CPSR寄存器中的条件标志位;

SMLAL指令格式与实例展示如下:
在这里插入图片描述

图4 SMLAL指令格式

UMULL指令

UMULL指令的作用如下:

  • 实现两个32位的无符号数的乘积,乘积结果的高32位存放到一个32位的寄存器中,乘积结果的低32位存放到另一个32位的寄存器中;
  • 同时将根据运算结果设置CPSR寄存器中相应的条件标志位;

UMULL指令格式与实例展示如下:

在这里插入图片描述

图5 UMULL指令格式

UMLAL指令

UMLAL指令的作用如下:

  • 实现将两个32位无符号数的64位乘积结果与和中的64位无符号数相加,加法结果的我高32位存放到一个32位寄存器中,加法结果的低32位存放到另一个32位的寄存器中;
  • 同时根据运算结果设置CPSR寄存器中相应的条件标志位;

UMLAL指令格式与实例展示如下:

在这里插入图片描述

图6 UMLAL指令格式

更多精彩内容,敬请关注公号“ADAS与ECU之吾见”!

猜你喜欢

转载自blog.csdn.net/wto9109/article/details/128107432