· Начало · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› D.Knuth, Chapter 3, $3.2.2

Посл.отвђт Сообщенiе


Дата: Июл 12, 2004 17:33:46
Правка

Если кто разбирался с этим, прошу помощи.

В параграфе 3.2.2, на стр. 44 (Д.Кнут «Искусство программирования для ЭВМ».—"Мир".—М.1977) описан алгоритм аддитивного датчика, порождающего случайную последовательность битов.

Я хотел реализовать его на ассемблере, но натолкнулся на странную вещь: описание алгоритма и его шагов не совпадает с приведённым кодом на языке MIX! Конечно, нельзя сказать, что я за неделю полностью освоился в новом языке, но в этом случае отличия налицо. Судите сами:
; как я понимаю язык MIX
LDA  Y    ; загрузка памяти по адресу У в регистр А
ADD  Y    ; сложение значения по адресу У с содержимым регистра А
JNOV *+2  ; переход (через команду) если не было переполнения
XOR  C    ; в противном случае побитовое исключающее ИЛИ (содержимое С с регистром А)
STA  Y    ; сохранение значения регистра А в память по адресу У


В книге же в комментариях к коду сказано следующее:
1. (Предполагаем, что сигнал переполнения выключен.)
2. Сдвиг влево на 1 разряд
3. Переход, если в старшем разряде вначале был 0
4. В противном случае корректируем число операцией "исключающее ИЛИ"
5. -

Опираясь на комментарии, я написал такой код:
  mov  al,[bY]
  mov  cl,[bC]
  shl  al,1
  js   @F      ; правда, не уверен, переход нужен здесь иди до операции сдвига
  xor  al,cl
@@:
  mov  [bY],al


Мне бы хотелось, чтобы кто-нибудь прояснил даную ситуацию и показал, откуда вз-ялось несоответствие: то ли от ошибки в книге, то ли от моего незнания MIX?

Ну, и конечно, хотелось бы оптимизировать ассемблерный код для подпрограммы генерации последовательности чисел.

P.S. К сообщению прикреплено тестовое приложение, может быть, кто-то заинтересуется его идеей…


1769326501__bin_test.zip


Дата: Июл 14, 2004 16:54:40

Конкретно по данному куску кода. Где нессоответствие между описанием и фрагменте на MIX? Нужно учесть что (X<<1) == X*X и что проверка переполнения при сдвиге влево основывается на проверке выдвигаемого "наружу" бита.

А ассемблерный эквивалент будет таким :
mov al, byte ptr [bY]
shl al, 1 ; выдвигает старший бит в CF
jnc F
xor al, byte ptr [bC]
F :
mov byte ptr [bY], al


Дата: Июл 14, 2004 17:35:41 · Поправил: Black_mirror

IceStudent

Использование регистра al дает очень маленький период последовательности(Не длинее 28. Хотя какой должна быть константа, чтобы достичь такой длины - вопрос. А может без программы из упражнения 7 его вообще не достичь). Но переходы здесь совершенно лишние:
  mov eax,[Y]
  add eax,eax
  sbb edx,edx
  and edx,[C]
  xor eax,edx
  mov [Y],eax


Дата: Июл 14, 2004 19:18:30
Правка

Nem
„Где нессоответствие “
ADD Y и [shl al,1[/b]

Значит, эти команды работают одинаково, применительно к данному коду??

Black_mirror
Да, я знаю. Я просто попробовал, мне хватило пока 256 значений.

О переходах — я пока не освоил работу без них… Это большое упущение с моей стороны.