← 返回笔记列表

3.1算术指令

2026-03-15
计组汇编

一.加减法


笔记图片

这个进位位如果加在一起结果就是正确的,否则他会存在CCR里面,遇到我们之前的问题,

笔记图片

这个意思是我们如果有两个64位的数加减法我们进行这样一个操作,把两个数的高32位分别保存在r1和r3里面,低32位保存在r0和r2里面,然后进行相加,其中进位位也被加进去,最后再拼起来

笔记图片

二.乘除法

笔记图片

我们同理用两个寄存器保存数据,用一个寄存器计算的结果高32位会被直接丢弃,所以高32位用一个寄存器,低32位用一个寄存器


笔记图片

同理这也是我们之前的那个结论
如果错误地使用了 `MUL` 导致结果丢失高 32 位?
假设你想算 `0x80000000 * 0x80000000`(两个很大的数,结果是 2⁶²,需要 63 位),却错误地用了 `MUL`:
- 数学结果:0x40000000 00000000(64 位).
- `MUL` 结果:只得到低 32 位,即 0x00000000,高 32 位(0x40000000)丢失了.
- 这会导致程序计算出错.
但这不是指令的错,而是程序员的错:选错了指令.程序员需要根据操作数的可能范围,决定使用 `MUL` 还是 `UMULL`/`SMULL`.
下面看个例子:

笔记图片

实现向量数量积,也就是我们把向量的元素个数赋给n,然后用两个寄存器指向向量v1和v2,每次load之后加4把下一个位置的新元素赋给r0和r1,我们把r0和r1的乘积保存在r3,然后判断是否n为0,否则就继续循环,然后直到n减为0,记得用SuBS,更新状态位,否则下面的BNE判断CCR会有问题,最后直到n减为0,r3就是所求的值