Заменить #10 на #20. Но тогда, естественно, уже возможно перепеолнение.
Код совершенно классический, есть в любом букваре. Есть также классическая вариация с выходом по обнулению второго множителя. Она в среднем быстрее, если множитель маленький, то в разы.
Набил по памяти, но вроде правильно. Это т.н. алгоритм с восстановлением, классическая оптимизация. Тело цикла умножения -- это 2$..bcs 2$ для единичного бита и 2$..br 2$ для нулевого. Выполняется до исчерпания единичных бит в меньшем множителе.Код:; r0 = r1 * r2 mul: clr r0 cmp r1, r2 bhis 1$ xor r1, r2 xor r2, r1 xor r1, r2 1$: tst r2 beq 0$ clc ror r2 bcc 2$ add r1, r0 2$: asl r1 add r1, r0 asr r2 bcs 2$ beq 3$ sub r1, r0 br 2$ 3$: sub r1, r0 0$: rts r7
Можно ещё быстрее, но это приводит к ещё большему объёму кода.
А ещё быстрее -- через таблицу квадратов, пользуясь следующим равенством:
((x + y) ^ 2) / 4 - ((x - y) ^ 2) / 4 = x * y;




Ответить с цитированием