В делении аналогичный фрагмент с не вполне корректным изменением знака
Код:COM R4 ; dividend was negative NEG R3
В делении аналогичный фрагмент с не вполне корректным изменением знака
Код:COM R4 ; dividend was negative NEG R3
Вы оба правы, внёс предложенные исправления.
Заодно подумаю над фиксом MKDOS, чтобы вектор обработки команд расширенной арифметики всегда указывал на драйвер, а не сбрасывался системой постоянно.
Какой всё же должен быть ответ и флаги при MUL #100000,R5 если в R5 число 77777 ?
manwe.pdp-11.ru
Результат умножения -32768dec*32767dec=-1073709056dec=30000100000oct=C0008000hex
Кстати, команда ASH ведь работает с 16-битным числом, а сдвиг задаётся 6-ю битами. Значит, если сдвиг больше 15 или меньше -15, то мы сразу знаем ответ? При сдвиге влево это 0, а при сдвиге вправо это SXT от аргумента.
manwe.pdp-11.ru
Еще спорный момент с флагом C при умножении.
"C: set if the result is less than -2^15 or greater than or equal to 2^15."
Как я понимаю из этого описания, нужно установить флаг если результат <-2^15 или >=2^15, т.е. текущий вариант процедуры неправильно установит флаг, если результат =-2^15. Или я неправильно понял описание (или описание не совсем корректное). Для проверки можно, например, умножить #1 на #100000
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Само умножение можно немного ускорить и сократить
Скрытый текст
Код:... CLR R4 mov r2,r3 xor r5,r3 ; result's sign ... BPL 1 NEG R2 1: TST R5 BPL 2 NEG R5 2: ... CLR R1 CLR R0 ; R0_R1 = R4_R5 * R2 br 31 3: ; main loop BCC 5 ADD R5,R1 ADC R0 ADD R4,R0 5: ASL R5 ROL R4 31: ROR R2 bne 3 ; end of main loop ADD R5,R1 ADC R0 ADD R4,R0 7: ... 72: TST R3 ; result's sign bpl 0 ...[свернуть]
Не проходит тест умножение -7 на 3 и 7 на -3 - ответ получается положительный, 21.
Видимо, не надо было убирать INC R3 и DEC R3. Если их оставить, то тесты проходят.
Впрыгнуть в конец цикла, чтобы избежать лишнего BR в цикле - хорошая идея, действительно ускоряет умножение в среднем на 26 тактов. Спасибо.
Заодно ускорил ASH для сдвига вправо:
Код:3: BIS #177760,R5 ; leave only 4 bits of negative value ADD #20,R5 ; 16 ASL R5 ; offset ADD R5,PC .repeat 16. { ASR R4 } CLV ; bit V should be 0 after right shift
Последний раз редактировалось Manwe; 08.02.2020 в 11:47.
manwe.pdp-11.ru
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)