Я собираюсь в сборку, и я продолжаю работать в xor, например:
xor ax, ax
Просто ли это значение регистра?
Я собираюсь в сборку, и я продолжаю работать в xor, например:
xor ax, ax
Просто ли это значение регистра?
A XOR B
на английском языке будет переведено как "А и В не равны". Итак, xor ax, ax
установит ax
в ноль, так как ax всегда равен самому себе.
A B | A XOR B
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0
xor reg, reg
часто используется для очистки регистра. Это может быть альтернативой mov reg, 0
AFAIR, в некоторых случаях это было быстрее (или короче).
И, конечно, сам XOR - это операция eXclusive OR (a.k.a.: исключительная дизъюнкция) (но стыдно описывать здесь такие основы - использовать Википедию)
xor ax, ax
- это самый быстрый способ установить регистр токов на 0
. Самый быстрый с точки зрения размера инструкции и количества инструкций. Для подробностей о том, как это работает, вам нужно немного знать битовую арифметику.
Операция XOR между двумя битами возвращает 1, если один и только один из двух бит равен 1; 0 в противном случае. Другой способ объяснить, что он возвращает 1, если два бита отличаются друг от друга; 0 в противном случае.
Операция XOR между двумя двоичными числами одинаковой длины работает также поэтапно. XOR два числа вы получаете число с битами, установленными в 1, где соответствующие биты двух операндов отличаются, 0, когда соответствующие биты одинаковы.
Из этого знания довольно легко видеть, что если оба операнда одинаковы (например, ax и ax), результат будет равен 0.
xor register, register
обычно используется для "нуля" регистра, поскольку все биты сравниваются друг с другом:
0-бит остается равным нулю. 1-биты становятся равными нулю, потому что 1 XOR 1 также равен 0.
A B | XOR
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0
Инструкция XOR выполняет описанную выше операцию для каждой пары бит в двух операндах. Итак, 0xFF xor 0xFF
будет 0x00
, а 0x55 xor 0xAA
будет 0xFF
. И да, xor ax ax
очищает ax
.
xor = exclusive или. См. Определение wikipedia для Эксклюзив или.
Если у вас есть регистр с самим собой, он будет нулевым для этого регистра.
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
В качестве примера возьмем значение 41 (в двоичном формате):
101001
xor 101001
= 000000
В этом случае он очистит регистр... XOR является "эксклюзивным" или "... поэтому, если ax содержит 1010, и вы эксклюзивны или что с 1010 вы получите 0000 (очищено)
Когда я начал программировать давно, не было ни эксклюзив, ни как на процессоре, так и в компиляторе. Когда я добрался до него, я придерживался описаний:
так:
0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1
и
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
Он определяет логический eXclusive OR
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
Итак, ИСТИНА, только если одно из выражений истинно, не оба.
Если я правильно помню xor ax, ax является инструкцией по сборке по одному байту, тогда как mov ax, 0 будет не менее 3 и, вероятно, займет немного больше времени для выполнения, Это, конечно, займет больше времени, чем инструкция xor.
xor ax, ax используется для установки ax на 0.
Причина: обычно команда xor на любом процессоре занимает меньше байтов при сборке, чем при использовании movl 0,%ax