5
GCCが整数除算を実装する際に奇妙な数による乗算を使用するのはなぜですか?
私は約読んでいるdivとmul組立オペレーション、と私はC言語で簡単なプログラムを作成することにより、アクションでそれらを見ることにしました。 ファイルDivision.c #include <stdlib.h> #include <stdio.h> int main() { size_t i = 9; size_t j = i / 5; printf("%zu\n",j); return 0; } そして、次のコードでアセンブリ言語コードを生成します。 gcc -S division.c -O0 -masm=intel しかし、生成されたdivision.sファイルを見ると、div操作は含まれていません。代わりに、ビットシフトとマジックナンバーを使用して、ある種のブラックマジックを実行します。計算するコードスニペットはi/5次のとおりです。 mov rax, QWORD PTR [rbp-16] ; Move i (=9) to RAX movabs rdx, -3689348814741910323 ; Move some magic number to …