私はアセンブリに入ります、そして、例えば、私はxorに走り続けます:
xor ax, ax
レジスタの値をクリアするだけですか?
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
xor reg, reg
は、レジスタのクリアによく使用されます。 mov reg, 0
の代替として使用できます
AFAIR、場合によってはより高速(または短かった)。
そしてもちろん、XOR自体は排他的ですOR(a.k.a .:排他的選言)操作)
xor register, register
は、一般にすべてのビットが互いに比較されるため、レジスタを「ゼロ」にするために使用されます。
0ビットはゼロのままです。 1 XOR 1も0であるため、1ビットはゼロになります。
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
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 ax
はax
をクリアします。
この場合、レジスタをクリアします... XORは「排他的論理和」...
私がずっと前にプログラミングを始めたとき、排他的またはプロセッサ上またはコンパイラ上にはありませんでした。私がそれに近づいたとき、私は説明に固執しました:
そう:
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
論理的な排他的ORを決定します
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
したがって、両方ではなく、一方の式が真である場合にのみTRUEになります。
正しく覚えている場合xor ax、axは1バイトのAssembly命令ですが、mov ax、は少なくとも3であり、おそらく実行に少し時間がかかります。確かにxor命令よりもデコードに時間がかかります。
xor ax、axは、axを0に設定するために使用されます。
理由:通常、すべてのプロセッサのxor命令は、movl 0,%ax