ARM汇编之乘法指令
前言
首先,请问大家几个小小问题,你清楚:
- 乘法指令有哪些种类呢?
- ARM乘法指令具体的使用场景又有哪些?
今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:
正文
ARM存在两类乘法指令,一个是32位乘法指令,得到的最终结果均为32位。另一个则是64位乘法指令,得到的结果都是64位。
32位乘法指令
MUL指令:
MUL指令的作用如下:
- 实现两个32位数(可以是有符号数,也可以是无符号数)的乘法运算,并将结果最终存入一个32位的寄存器中;
- 同时还会根据运算结果设置CPSR寄存器中相应的条件标志位;
- 由于两个32位数相乘结果为64位,而MUL指令仅仅保留了64位结果的低32位,所以无论对于有符号数还是无符号数的操作数而言,MUL指令执行的结果都是相同的。
MUL指令格式与实例展示如下:
MLA指令
MLA指令作用如下:
- 实现两个32位(可以为无符号数,也可为有符号数)的乘积,再加上第3个操作数,并将结果保存到一个32位的寄存器中;
- 同时根据运算结果设置CPSR寄存器中相应的条件标志位;
MLA指令格式与实例展示如下:
64位乘法指令
SMULL指令
SMULL指令作用如下:
- 实现两个32位的有符号数的乘积,将乘积结果的高32位存放到一个32位寄存器的中,乘积结果的低32位存放到另一个32位的寄存器中;
- 根据运算结果设置CPSR寄存器中的相应条件标志位,考虑到指令执行的效率,指令中的所有操作数都放在寄存器中。
SMULL指令格式与实例展示如下:
SMLAL指令
SMLAL指令的作用如下:
- 实现将两个32位的有符号数的64位乘积结果与和中的64位数相加,加法结果的高32位存放到一个32位的寄存器中,加法结果的低32位数存放到另一个32位的中;
- 同时根据运算结果设置CPSR寄存器中的条件标志位;
SMLAL指令格式与实例展示如下:
UMULL指令
UMULL指令的作用如下:
- 实现两个32位的无符号数的乘积,乘积结果的高32位存放到一个32位的寄存器中,乘积结果的低32位存放到另一个32位的寄存器中;
- 同时将根据运算结果设置CPSR寄存器中相应的条件标志位;
UMULL指令格式与实例展示如下:
UMLAL指令
UMLAL指令的作用如下:
- 实现将两个32位无符号数的64位乘积结果与和中的64位无符号数相加,加法结果的我高32位存放到一个32位寄存器中,加法结果的低32位存放到另一个32位的寄存器中;
- 同时根据运算结果设置CPSR寄存器中相应的条件标志位;
UMLAL指令格式与实例展示如下:
更多精彩内容,敬请关注公号“ADAS与ECU之吾见”!