还算幸运,GBA处理器有一些乘法指令。它们是:MUL, MLA, UMULL, UMLAL, SMULL, SMLAL。这些指令都能通过S来指明是否要影响状态标志。还有这些指令只能使用寄存器作为操作数,并且都没有位移部分。
指令MUL是最基本的。它进行一个32位的乘法,格式如下:
MUL DEST, OP1, OP2 @ DEST = OP1 * OP2。结果可能会大于32位,但是使用MUL指令的话,多出来的部分就丢失了。
指令MLA和MUL很相似,只是它多了一个操作数,像这样:
MLA DEST, OP1, OP2, OP3 @ DEST = (OP1 * OP2) + OP3。前两个操作数相乘,然后加上最后那个。
MLA的意思是MuLtiply with Accumulate。比如:
MLA r9, r0, r1, r2 @ r9 = (r0 * r1) + r2. 不会比这个更复杂了!
指令UMULL和SMULL分别是32位的无符号和有符号乘法。和MUL的区别在于,它们允许64位的结果,格式如下:
UMULL DEST(upper 32), DEST(lower 32), OP1, OP2 @ 第一个寄存器保存结果的高32位,第二个寄存器保存低32位,OP1和OP2相乘。
指令UMLAL和SMLAL是64位版本的MLA,它们也能保存64位的乘法结果,并且再做一个64位的加法。比如:
UMLAL r0, r1, r2, r3 @ r0和r1构成一个64位数,r2和r3相乘,结果和r0/r1相加。最终结果再存放入r0和r1。
我希望我说格式的时候,你都能明白DEST, OPx等等是什么意思,你能用任何寄存器替换这些东西。OP1, OP2, DEST这些不是真的寄存器名。
我很想写一下减法指令,但是并没有减法指令...哀乐。不过放心大胆地使用乘法指令吧,和减法不一样,这些指令都很快。