Это приведет к неожиданным результатам, если верхнее слово D3
содержит данные больше 1.
LOOP CLR.W D3 ; D3 = [**** 0000]
MOVE.W D1,D3 ; D3 = [**** X]
DIVU #2,D3 ; if D3.h > 1, division overflows and D3 does not change
SWAP D3 ; Lower word is (X%2) or random data
Если вы действительно хотите использовать DIVU
, обязательно очистите длинный регистр (с clr.l d3
или на самом деле быстрее moveq #0,d3
). Просто очищать нижнее слово бессмысленно, если потом перезаписать его.
Но, как сказал @PeterCordes, DIVU
очень неэффективно для проверки младшего бита (я не буду указывать на другие недостатки в вашем коде). Лучше использовать btst #0,d1
(устанавливает флаг Z
, если бит пуст).
Альтернативы:
and.w
число 1 со значением, которое вы хотите проверить. Также устанавливает флаг Z
, если младший бит пуст
- Сдвиг значения вправо (устанавливает флаг
C
, если был установлен младший бит)
Конечно, вы также можете частично развернуть цикл и использовать тот факт, что (X%2) != 0
верно для каждой другой итерации. И вы можете полностью развернуть цикл и напрямую переместить результат в свою цель (это то, что смогут сделать большинство оптимизирующих компиляторов: https://godbolt.org/z/VGecJ3).