1. ホーム
  2. gcc

[解決済み] シュール vs サール ... x86 アセンブリ gnu

2022-02-08 14:51:18

質問内容

gccでコンパイルしてアセンブリを見ていますが、このコードはいったい何をやっているのでしょうか?

shrl $20, %edx
leal (%edx,%eax), %eax
sarl 1, %eax 

変数Xがedxレジスタに、Yがeaxにあり、どちらも(32ビットint)であるとする。これはどうなっているのでしょうか?

shrl $20, %edx'は%eaxを20ビット右にシフトしているので、eax/(2^20)と同じであることは知っている。 で、sarl も同じなので 'sarl 1, %eax' = eax/(2^1) となります。 これは正しいのでしょうか、もしそうならlealは何をするのでしょうか?

どのように解決するのですか?

と仮定すると sarl 1, %eax は、本来は sarl $1, %eax になる、ならば全体が等しくなる。

x = ((unsigned int) x) >> 20;
y = (x + y) >> 1

leal という命令を意味します。 eax = eax + edx . これは リンク が参考になるかもしれません。 これ .