Оператор MIX DIV и Преобразование количества упакованных байтов

Я просматриваю книгу Кнута The Art of Computer Programming, и у меня есть вопрос о языке ассемблера MIX, в частности об операторе DIV.

На стр. 133 он приводит пример того, как оператор DIV влияет на регистры накопителя и расширения, учитывая определенное состояние этих регистров и входную ячейку памяти. Вопрос описан (и, я думаю, на него дан ответ) в этом сообщении о переполнении стека: работать в MIX?

Моя проблема в том, что человек, который ответил, преобразовал значение 10-байтового слова, хранящегося в rAX (регистры A и X), в одно число, используя метод, который я не понимаю:

Если вы выполните деление вручную, преобразовав байты в одно число, вы получите -210 501 825 (если вы используете наименьший тип байта - 6 бит (!) в книге Кнута)

Может ли кто-нибудь провести меня через это преобразование?

Спасибо, Сэм


person user2593263    schedule 16.08.2016    source источник


Ответы (1)


Это зависит от размера байта, который вы используете. Кнут намеренно оставляет базовую реализацию байтов неопределенной — каждый байт может поддерживать от 64 до 100 базовых значений, но минимум — 64, и это то, что, по-видимому, использует большинство реализаций.

Предположим, что каждый байт содержит 64 значения, и допустим, у вас есть следующее содержимое регистра в rA:

+ 01 02 03 04 05

Самый младший байт находится справа. Следовательно, «общее» значение всего регистра rA будет:

= (1 * 64^4) + (2 * 64^3) + (3 * 64^2) + (4 * 64^1) + (5 * 64^0)
= (1 * 16777216) + (2 * 262144) + (3 * 4096) + (4 * 64) + (5 * 1)
= 17314053

Это именно то, что вам даст GNU MDK:

MIX> weval 1(1:1),2(2:2),3(3:3),4(4:4),5(5:5)
+ 01 02 03 04 05 (0017314053)

Для rAX (rA и rX рассматриваются как один регистр) та же идея, за исключением того, что вы помещаете rA слева от rX. Итак, если у вас есть:

rA = + 01 02 03 04 05
rX = + 06 07 08 09 10

Общая стоимость будет:

(1 * 64^9) + (2 * 64^8) + (3 * 64^7) + (4 * 64^6) + (5 * 64^5) +
(6 * 64^4) + (7 * 64^3) + (8 * 64^2) + (9 * 64^1) + (10 * 64^0)

Для десятичной реализации вы просто используете 100 вместо 64 в качестве основы. Таким образом, в исходном примере вы получите:

= (1 * 100^4) + (2 * 100^3) + (3 * 100^2) + (4 * 100^1) + (5 * 100^0)
= 102030405

Надеюсь, это поможет.

person Chris Vig    schedule 31.08.2016
comment
Это фантастика. Спасибо. Эти примеры меня тоже смутили. - person Thomas Hodges; 18.07.2018