Как сделать четное нечетное число или наоборот в сборке Motorola 68000? - PullRequest
0 голосов
/ 03 мая 2018

В принципе, если бы у меня был номер в D1, и я хотел, чтобы он всегда был четным, как бы я мог убедиться, что он никогда не будет нечетным?

Я знаю, что это как-то связано с инструкцией AND. Но когда я пытался это сделать, он всегда вычитал 1. Таким образом, он превращал нечетные числа в четные, а четные числа в нечетные.

Как я могу в основном сделать if n is odd, sub 1

Ответы [ 5 ]

0 голосов
/ 28 августа 2018

Вам нужно только очистить нижний бит, поэтому, пока другие использовали длинные инструкции, нет ничего плохого в использовании байтовой формы AND

AND.B #0xFE, D1   ; make even
OR.B  #0x01, D1   ; make odd
XOR.B #0x01, D1   ; toggle even/odd

Независимо от размера значения в D1 (байт, слово или длинное слово), вы по-прежнему очищаете младший бит и оставляете все остальные биты в регистре неизменными

С другой стороны

BCLR #0,D1  ; make even
BSET #0,D1  ; make odd
BCHG #0,D1  ; toggle even/odd 
0 голосов
/ 09 мая 2018

Процессор 68000 фактически имеет отдельные команды установки битов и сброса битов. В таких случаях, как ваш, может быть проще и яснее явно очистить бит 0 операнда, не возвращаясь к логической логике:

bclr.l #0,d0

вместо

and.l $fffffffe,d0
0 голосов
/ 03 мая 2018

and ваш номер с -2.

В представлении дополнения 2 -2 число со всеми битами, установленными в единицу, кроме самого младшего (11111 ... 110), поэтому, в качестве маски, оно всегда убивает только младший бит вашего числа. Это заставляет его быть четным (он работает правильно даже для отрицательных чисел).


Что касается «наоборот» в названии: сделать противоположное (= заставить каждое четное число переходить к следующему нечетному), просто or с 1. Это устанавливает младший бит равным 1, что дает требуемый эффект.

0 голосов
/ 03 мая 2018

Для 16-битного числа сделайте это:

EvenNumber = (D1 & 0xFFFE);
0 голосов
/ 03 мая 2018

Нечетные числа оканчиваются на 1 в двоичном, а четные числа оканчиваются на 0 в двоичном. Что вы действительно хотите, так это чтобы последняя двоичная цифра была 0 независимо от того, с чего она начиналась. (Это вычтет 1 из нечетных чисел и оставит четные числа без изменений.)

Способ сделать это - И с 1111...1110, где все двоичные цифры 1, кроме последней цифры, которая 0. Вы можете построить это, выполнив побитовое отрицание на 0000...0001, что, конечно, просто 1.

Итак, если ваш номер n, вы хотите вычислить n & (~1).

...