【问题标题】:How does division work in MIX?MIX 中的除法是如何工作的?
【发布时间】:2009-04-20 16:08:51
【问题描述】:

有人可以向我解释 MIX 中的除法(来自 Knuth 的 TAOCP)是如何逐字节工作的吗?

rA = |-| . . . .0| 

rX = |+|1235|0|3|1|

内存位置1000包含|-|0|0|0|2|0|

当你执行操作时

DIV 1000

寄存器变成

rA = |+|0|617|?|?|

rX = |-|0|0|0|?|1|

现在我了解了rArX 上的符号,但是rAX 的字节是按什么顺序填充的,以及进行了哪些划分?

如果 DIV 1000 导致每个位除以 2,那么我希望

rAX = |+|617|0|1|0|-|0|1|0|1|1| 

其中rA 包含除法结果,rX 包含余数(从右侧填充)。

我可能在这里遗漏了一些东西,Knuth 似乎认为我应该能够自己弄清楚(因此关于它的 10 级问题,我也没有得到),但是有人可以在这里帮助我?

【问题讨论】:

    标签: assembly division knuth taocp


    【解决方案1】:

    所以我自己想通了。

    如果您手动进行除法,通过将字节转换为单个数字,您将得到 -210,501,825(如果您使用的是最小类型的字节 - 在 Knuths 书中是 6 位 (!))。将其除以 -128,即使用相同字节大小的位置 1000 中的值。

    商为 1644545,余数为 65,符号为正,因为两个数字都是负数。如果你将 1644545 存储在 rA 中,将 65 存储在 rX 中,你会得到

    |+|0|6|17|32|01|
    |-|0|0|0|1|1|
    

    使用最小的字节大小(可容纳 64 个数字)。由于 Knuth 在他的示例中从未假设特定的字节大小,因此 rX 有许多问号。 rX 的符号始终是 rA 的前一个符号。

    编辑:我使用了非常方便的 MixEmul 实用程序来玩弄 MIX 的寄存器。这是在 .NET 中完成的非常好的 MIX 实现

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 2017-06-06
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多