[译文]GBAGuy的GBA ASM教材 第七章 乘法

还算幸运,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这些不是真的寄存器名。

 

我很想写一下减法指令,但是并没有减法指令...哀乐。不过放心大胆地使用乘法指令吧,和减法不一样,这些指令都很快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值