Как работает разделение в MIX?

Может кто-нибудь объяснить мне, как деление в MIX (от TAOCP от Knuth) работает на байтовой основе?

rA = |-| . . . .0| 

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

Память 1000 содержит |-|0|0|0|2|0|,

Когда вы выполняете операцию

DIV 1000

регистры становятся

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

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

Теперь я понимаю знаки rA а также rX, но в каком порядке байты rAX заполнены и какие делаются делаются?

Если DIV 1000 приводит к каждому биту, деленному на 2, то я ожидаю

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

в котором rA содержит результаты деления и rX остатки (заполнены с правой стороны).

Я, вероятно, что-то здесь упускаю, и Кнут, кажется, думает, что я должен сам это выяснить (отсюда вопросы 10-го уровня об этом, которые я тоже не получаю), но может ли кто-нибудь помочь мне здесь?

1 ответ

Решение

Так что я как-то понял это сам.

Если вы выполните деление вручную, преобразовав байты в одно число, вы получите -210 501 825 (если вы используете самый маленький тип байта - который равен 6 битам (!) В книге Кнутов). Разделите это на -128, которое является значением в местоположении 1000, используя тот же самый размер байта.

Частное 1644545, остаток 65, знак будет положительным, так как оба числа являются отрицательными. Если вы храните 1644545 в rA и 65 в rX, вы получите

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

используя наименьший размер байта (который содержит 64 числа). Так как Кнут никогда не принимает определенный размер байта в своих примерах, у rX есть несколько вопросительных знаков. Знак rX всегда является предыдущим знаком rA.

Edit: я использовал очень удобную утилиту MixEmul, чтобы поиграть с регистрами MIX. Это очень хорошая реализация MIX, сделанная в.NET

Другие вопросы по тегам