|
|
| Посл.отвђт | Сообщен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 значений. О переходах — я пока не освоил работу без них… Это большое упущение с моей стороны. |