【发布时间】:2013-11-02 21:24:00
【问题描述】:
在理解使用 x86 汇编语言的好处时,我正在尝试编写一个 16x16 位 乘法例程,它接受 两个无符号 16 位值和使用 shifting 和 *addin*g 将它们相乘,并将最终的 32 位结果存储在 DX:AX 中。
运行代码没有问题(换句话说,它编译得很好并与我的链接程序一起运行),但是代码没有给出预期的乘法结果。
这是我目前想出的:
理论上这应该给我 DX:AX 中的无符号 32 位结果。
当我在我的程序中使用此代码时,32 位 结果的低 16 位(或者换句话说,AX 部分)是正确的并显示出来正好。 32 位结果(DX 部分)的高 16 位不正确。
谁能帮我弄清楚我做错了什么?
提前致谢
【问题讨论】:
-
我怀疑这真的比简单的
mov ax, cx; mul bx快。或者你是在尝试这个作为练习吗? -
@PMF 主要是一个了解如何完成的练习,尽管看到比使用 mul 指令更快的东西会非常有趣(因为它显然仅次于 div 作为最慢的指令在 8086 上)。
-
是的,大约 20 年前,在我阅读的第一本 asm 书中,他们编写了一个计算器程序,但因为那时 mul 和 div 确实非常慢,所以他们像您在这里一样使用按位移位。但如果今天的微码架构仍然如此,我真的会感到惊讶。