[转译][马基 杰斯特(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 指令