Как работает разделение в MIX? - PullRequest
5 голосов
/ 20 апреля 2009

Может кто-нибудь объяснить мне, как деление в 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 Ответ

3 голосов
/ 21 апреля 2009

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

Если вы выполните деление вручную, преобразовав байты в одно число, вы получите -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

...