[转译][马基 杰斯特(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指令是无符号乘,所以F8000087都会被当作无符号数 (正数)

目的操作数必须是一个数据寄存器,而源操作数可以是立即数,数据寄存器,内存地址或是地址寄存器表示的内存地址,比如:

    mulu.w     d1, d0
    mulu.w     $00000010, d0
    mulu.w     (a0), d0

在上面的例子中,d0的一个会和源操作数中的一个相乘,结果总是以长字的长度存放到d0中去

对于源操作数不能直接使用一个地址寄存器:

    mulu.w     a0, d0     

最后,指令指定的长度只能是 (.w),你不能使用字节或者长字

MULS 指令

MULS (Signed MULtiply) - 有符号乘

这条指令和MULU几乎一样 (包括指令的语法格式),当然了,除了一点,那就是源操作数目的操作数都会被当成有符号数不是无符号数,所以从8000FFFF的数都是负数

例子

假定d0的内容是0000FFC0

    muls.w     #$0010, d0

于是d0中的FFC0乘以0010

    FFC0 x 0010 = FFFFFC00

注意这里FFC0是被当作负数处理的,由于0010是个正数,所以事实上所做的乘法是:

   -0040 x +0010 = -00000400

所以d0中的内容就变成了FFFFFC00 (-400)

这就是MULUMULS唯一的区别了

目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 肆 - 正负 指令 | 7. ROL 和 ROR 指令
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 肆 - 正负 指令 | 9. DIVU 和 DIVS 指令

posted @ 2020-03-03 09:57  草帽过客  阅读(1021)  评论(0编辑  收藏  举报