アセンブリに取り掛かっていますが、xor に遭遇し続けています。次に例を示します。
xor ax, ax
レジスタの値をクリアするだけですか?
A XOR B
英語では「are A and B not equal」と訳されます。axは常にそれ自体に等しいため、ゼロxor 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 (別名: 排他的論理和) 操作です (しかし、ここでそのような基本を説明するのは残念です - ウィキペディアを使用してください)。
xor ax, ax
は、ax レジスタを に設定する最速の方法0
です。命令のサイズと命令数の点で最速。それがどのように機能するかの詳細については、ビット演算の知識が少し必要です。
2 つのビット間の XOR 演算は、2 つのビットのうち 1 つだけが 1 の場合に 1 を返します。それ以外の場合は 0。説明する別の方法は、2 つのビットが異なる場合に 1 を返すということです。それ以外の場合は 0。
同じ長さの 2 つの 2 進数間の XOR 演算は、ビット単位で同様に機能します。2 つの数値を XOR すると、2 つのオペランドの対応するビットが異なる場合はビットが 1 に設定され、対応するビットが同じ場合は 0 に設定された数値が得られます。
この知識から、2 つのオペランドが同じ場合 (たとえば ax と ax)、結果が 0 になることはかなり簡単にわかります。
xor register, register
すべてのビットが互いに比較されるため、レジスタを「ゼロ」にするために一般的に使用されます。
0 ビットはゼロのままです。1 XOR 1 も 0 であるため、1 ビットはゼロになります。
xor = 排他的または。Exclusive またはのウィキペディアの定義を参照してください。
レジスタをそれ自体と 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 は「排他的 OR」です...したがって、ax に 1010 が含まれていて、排他的または 1010 を含む場合は、0000 (クリア) が得られます。
私の記憶が正しければ、xor ax, axは 1 バイトのアセンブリ命令ですが、mov ax, 0は少なくとも 3 で、おそらく実行に少し時間がかかります。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
xor ax,ax は、ax を 0 に設定するために使用されます。
理由: 通常、どのプロセッサの xor 命令も、movl 0,%ax
排他的論理和を決定します
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
したがって、TRUE は、式の両方ではなく、一方が true の場合にのみ TRUE になります。