Как работает разделение в 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