web-dev-qa-db-ja.com

x86アセンブリでXORの意味は何ですか?

私はアセンブリに入ります、そして、例えば、私はxorに走り続けます:

xor     ax, ax

レジスタの値をクリアするだけですか?

37
Chiggins

A XOR Bは英語では「AとBは等しくない」と翻訳されます。そう xor ax, axはaxが常にそれ自身と等しいため、axをゼロに設定します。

A B | A XOR B
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0
48
orlp

xor reg, regは、レジスタのクリアによく使用されます。 mov reg, 0の代替として使用できます

AFAIR、場合によってはより高速(または短かった)。

そしてもちろん、XOR自体は排他的ですOR(a.k.a .:排他的選言)操作)

18
Lukasz

xor register, registerは、一般にすべてのビットが互いに比較されるため、レジスタを「ゼロ」にするために使用されます。

0ビットはゼロのままです。 1 XOR 1も0であるため、1ビットはゼロになります。

6
Daniel Stelter

xor =排他的OR。 Exclusive or のウィキペディアの定義を参照してください。

レジスタ自体をxorすると、そのレジスタはゼロになります。

0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0

値41を例として(バイナリで)みましょう:

    101001
xor 101001
  = 000000
4
jweyrich
A B | XOR
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0

XOR命令は、2つのオペランドのビットのすべてのペアに対して上記の操作を実行します。したがって、0xFF xor 0xFF だろう 0x00および0x55 xor 0xAA だろう 0xFF。はい、 xor ax axaxをクリアします。

3
nmichaels

この場合、レジスタをクリアします... XORは「排他的論理和」...

2
John K.

私がずっと前にプログラミングを始めたとき、排他的またはプロセッサ上またはコンパイラ上にはありませんでした。私がそれに近づいたとき、私は説明に固執しました:

  • または:a = 1またはb = 1またはboth = 1の場合はtrue
  • xor:a = 1またはb = 1であり、both = 1ではない場合はtrue

そう:

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
2
Olof Forshell

論理的な排他的ORを決定します

0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

したがって、両方ではなく、一方の式が真である場合にのみTRUEになります。

1
Dirk

正しく覚えている場合xor ax、axは1バイトのAssembly命令ですが、mov ax、は少なくとも3であり、おそらく実行に少し時間がかかります。確かにxor命令よりもデコードに時間がかかります。

1
Sean

xor ax、axは、axを0に設定するために使用されます。

理由:通常、すべてのプロセッサのxor命令は、movl 0,%ax

1