XOR зарегистрироваться, зарегистрироваться (ассемблер) - PullRequest
7 голосов
/ 20 ноября 2011

Время от времени нам приходится анализировать фрагменты кода ассемблера (IA32), и чаще всего я сталкиваюсь с инструкцией, которая выглядит следующим образом:

xor ax, ax

или с другими регистрами, а также: xor dx, dx, xor al, al, ...

Что именно это делает?(топор или топор всегда дает 0?)

Ответы [ 3 ]

13 голосов
/ 20 ноября 2011

Это идиома обычного ассемблера для установки регистра в 0.

xor ax, ax соответствует ax = ax ^ ax, что, как вы уже заметили, эффективно ax = 0.

Если я правильно помню, главное преимущество в том, что его размер кода меньше mov ax, 0

2 голосов
/ 20 ноября 2011

Это именно то, что он делает - обнуляет содержимое регистра

1 голос
/ 28 ноября 2015

xor% ax,% ax, как указано в предыдущих комментариях, соответствует ax = ax xor ax. Это, по существу, устанавливает ax = 0. Кроме того, оно также влияет / модифицирует некоторые из EFLAGS, такие как OF, CF, SF, PF или ZF. В этом случае будут установлены флаги PF и ZF.

SF - указывает, привел ли результат последней операции к значению, старший бит которого установлен в 1.

PF - указывает, является ли количество установленных битов нечетным или четным в двоичном представлении результата последней операции.

ZF - устанавливается, если результат математической / логической операции равен нулю или сбрасывается иначе.

Пример показан ниже с использованием фрагментов GDB.

Инструкция: xor% ax,% ax

До "xor"

(gdb) info registers
eax            0xaa55   43605
ecx            0x0  0
edx            0x80 128
ebx            0x0  0
esp            0x6f20   0x6f20
ebp            0x0  0x0
esi            0x0  0
edi            0x0  0
eip            0x7c02   0x7c02
eflags         0x2  [ ]
cs             0x0  0
ss             0x0  0
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0

После "xor"

(gdb) info registers
eax            0x0  0          --------------------> AX = 0          
ecx            0x0  0
edx            0x80 128
ebx            0x0  0
esp            0x6f20   0x6f20
ebp            0x0  0x0
esi            0x0  0
edi            0x0  0
eip            0x7c04   0x7c04
eflags         0x46 [ PF ZF ] --------------------> Flags Set
cs             0x0  0
ss             0x0  0
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0
...