回到首页



用乘法指令来做除法的技巧
文/Agemo
last updated at 2004-03-13
===========================

       

	lui    v0, $2aaa
	ori    v0, v0, $aaab
	mult   a0, v0
	mfhi   t1

看上去是乘法,实际是除法。写出来公式就明白了。
	t1 = ($2aaaaaab * a0) 取高位
	   = ($2aaaaaab * a0)/$100000000
	   = a0 / 5;


注:Compiler优化指令的技巧,这几乎是所有PS游戏的除法编译结果。
虽然R3000也有除法指令,但是实际很少使用。


————————————————————————
在80x86平台下也是类似的。引用其他网站上文(作者:zzppallas)
	xor  edx, edx
	mov  eax, 51EB851Eh
	imul ecx
	shr  edx, 5
	mov  eax, edx

imul 的结果保存在 edx:eax中,edx 右移 5尾,相当于结果/0x20,00000000
其原始数据为
edx:eax = 0:xxxx
最后 edx 结果就是 ecx * 51EB851Eh / 2000000000h 后面的数据就是分母了
用个计算器就可以算出来分母为 100, 也就是说 最后 edx = ecx /100(十进制)