Я не понимаю, почему этот код работает не так, как ожидалось. Из того, что я понимаю, BTST.L #1,D1
проверяет, равен ли последний бит значения, хранящегося в D1, 1; в этом случае значение в D1 будет нечетным, и программа перейдет в ADDSUM.
Кажется, что он работает правильно с некоторыми значениями (9 * 2, 8 * 2 или 10 * 10), но терпит неудачу, когда я пытаюсь делать другие (11 * 11 дает мне 110, так же, как 10 * 11). Я полагаю, что всякий раз, когда множитель нечетен.
START:
MOVE.W #MULTIPLICAND,D0 ; Set D0 equal to the multiplicand
MOVE.W #MULTIPLIER,D1 ; Set D1 equal to the multiplier
MOVE.L #00000000,D2 ; Clear D2 as it will be used to store the product
LOOP BTST.L #1,D1 ; Check if D1 is odd
BEQ ADDSUM ; If so branch to ADDSUM
RETURN CMP #$01,D1 ; Check if the multiplier is equal to 1
BEQ END ; If so, terminate the loop
ASL #1,D0 ; Multiply the multiplicand by 2
ASR #1,D1 ; Divide the multiplier by two
BRA LOOP ; Branch back to the top of the loop
ADDSUM ADD.W D0,D2 ; Add D0 to D2
BRA RETURN ; After adding, we have to branch back to where we were in the loop
END SIMHALT