BTST не работает должным образом, чтобы определить, является ли число нечетным - PullRequest
0 голосов
/ 08 ноября 2018

Я не понимаю, почему этот код работает не так, как ожидалось. Из того, что я понимаю, 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

1 Ответ

0 голосов
/ 08 ноября 2018

Я понял это. Я решил опубликовать это как ответ на случай, если кто-нибудь еще наткнется на это.

Оказывается, я не понял, как работает инструкция BTST.L #1,D1. Я думал, что код в исходном примере должен был проверять, был ли последний бит в D1 равен 1. В действительности, BTST работает, устанавливая флаг кода состояния Z на 1, когда проверяемый бит равен 0. #1 в инструкции указывает, что он проверяет второй бит справа.

Чтобы определить четное / нечетное значение, нужно проверить самый правый бит. Я исправил свой код, изменив его на следующее:

LOOP          BTST.L #0,D1    ; Check if D1 is even (Z-flag will be set to 1 if bit is zero)
              BNE ADDSUM      ; BNE will branch to ADDSUM if Z-flag is not set (meaning D1 is odd)

Надеюсь, это поможет кому-то еще, у кого возникла такая же проблема.

...