x をゼロ (x = 0) に設定するには、csapp book で 2 つの方法が示されています。
初め:
xorq %rcx, %rcx
2番:
movq $0, %rcx
また、最初の 1 つは 3 バイトしか使用しないが、2 番目の 1 つは 7 バイトを使用することも示しています。
2 つの方法はどのように機能しますか? 最初のものは 2 番目のものよりもバイト数が少ないのはなぜですか?
x をゼロ (x = 0) に設定するには、csapp book で 2 つの方法が示されています。
初め:
xorq %rcx, %rcx
2番:
movq $0, %rcx
また、最初の 1 つは 3 バイトしか使用しないが、2 番目の 1 つは 7 バイトを使用することも示しています。
2 つの方法はどのように機能しますか? 最初のものは 2 番目のものよりもバイト数が少ないのはなぜですか?
最初のバイト数が 2 番目のバイト数よりも少ないのはなぜですか?
Peter Cordes の回答はすでに技術的な詳細に関するものですが、数学的な背景に焦点を当てたいと思います。
x86s CPU は明らかに大きな数値 (12345789 など) と値ゼロを区別しません。このような値を格納するには、4 バイトが必要です。
ただし、値ゼロは非常に特別な値です。
(aa) または (a XOR a) として記述できますが、"a" は任意の整数値にすることができます。
これは、トリックを実行できることを意味します。
subq %rcx, %rcx
値を計算する操作を実行します(rcx - rcx)
。どの値が含まれているかは気にしませんrcx
。その値をそれ自体から減算すると、結果はゼロになります ((aa)=0 のため)。
これは、rcx
その操作の後に が 0 になることを意味します。
xorq %rcx, %rcx
(a XOR a) も常に 0 であるため、操作は同じ効果を持ちます。