2

x をゼロ (x = 0) に設定するには、csapp book で 2 つの方法が示されています。

初め:

xorq %rcx, %rcx

2番:

movq $0, %rcx

また、最初の 1 つは 3 バイトしか使用しないが、2 番目の 1 つは 7 バイトを使用することも示しています。

2 つの方法はどのように機能しますか? 最初のものは 2 番目のものよりもバイト数が少ないのはなぜですか?

4

2 に答える 2

4

最初のバイト数が 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 であるため、操作は同じ効果を持ちます。

于 2019-09-25T11:46:53.987 に答える