[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 肆 - 正负 指令 | 8. MULU 和 MULS 指令
注意:本文经过原作者授权转译,转载请标明出处
原文地址:http://mrjester.hapisan.com/04_MC68/Sect04Part08/Index.html
条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉
翻译若有不足之处欢迎批评指正
译文:
"我当时想要找到一种事半功倍的方法,但是最终我又回到了起点" ---- 刘易斯 卡罗尔 (Lewis Carroll, 1832-1898),英国数学家、逻辑学家、童话作家、牧师、摄影师
简介
这一节我们会介绍两条乘法指令,之所以有两条,是因为其中一条用于无符号数,而另一条用于有符号数
MULU 指令
MULU (Unsigned MULtiply) - 无符号乘
这条指令会把目的操作数里的一个字和源操作数里的一个字相乘,结果以长字的长度放在目的操作数中
例子
这是个很简单的乘法的例子:
mulu.w #$0010, d0
假定d0之前的内容是00200040,指令执行时,d0中的一个字被读取 (0040),然后乘以0010
0040 x 0010 = 00000400
结果然后会被保存到d0中,于是d0中的内容就变成了00000400,你可能注意到d0里原本的高位的字 0020被无视而且被覆盖掉了,请记住这一点
再来康康另一个例子,这次假定d0的内容是FFFFF800:
mulu.w #$0087, d0
d0中的一个字被读取 (F800),然后乘以0087
F800 x 0087 = 0082C800
结果然后会被保存到d0中,于是d0中的内容就变成了0082C800。请记住,MULU指令是无符号乘,所以F800和0087都会被当作无符号数 (正数)
目的操作数必须是一个数据寄存器,而源操作数可以是立即数,数据寄存器,内存地址或是地址寄存器表示的内存地址,比如:
mulu.w d1, d0
mulu.w $00000010, d0
mulu.w (a0), d0
在上面的例子中,d0的一个字会和源操作数中的一个字相乘,结果总是以长字的长度存放到d0中去
对于源操作数你不能直接使用一个地址寄存器:
mulu.w a0, d0 ✖
最后,指令指定的长度只能是字 (.w),你不能使用字节或者长字
MULS 指令
MULS (Signed MULtiply) - 有符号乘
这条指令和MULU几乎一样 (包括指令的语法格式),当然了,除了一点,那就是源操作数和目的操作数都会被当成有符号数而不是无符号数,所以从8000到FFFF的数都是负数
例子
假定d0的内容是0000FFC0:
muls.w #$0010, d0
于是d0中的字FFC0乘以字0010
FFC0 x 0010 = FFFFFC00
注意这里FFC0是被当作负数处理的,由于0010是个正数,所以事实上所做的乘法是:
-0040 x +0010 = -00000400
所以d0中的内容就变成了FFFFFC00 (-400)
这就是MULU和MULS唯一的区别了
目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 肆 - 正负 指令 | 7. ROL 和 ROR 指令
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 肆 - 正负 指令 | 9. DIVU 和 DIVS 指令
浙公网安备 33010602011771号