アセンブリで10を計算する方法を工夫していたので、gccで次のようなCコードをコンパイルして、どうなっているのかを確認しました。私の驚きにモジュロ(%)のGCC実装はどのように機能し、なぜdiv命令を使用しないのですか?
unsigned int i=999;
unsigned int j=i%10;
私は
movl -4(%ebp), %ecx
movl $-858993459, %edx
movl %ecx, %eax
mull %edx
shrl $3, %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
addl %eax, %eax
movl %ecx, %edx
subl %eax, %edx
movl %edx, %eax
movl %eax, -12(%ebp)
-4(%のEBP)、または "i" は、入力および-12(%のEBP)または "j" が答えですが。です私はこれをテストしていて、あなたが何をしても何もしません-4(%ebp)。
私の質問は、このコードはどのように動作し、どのようにdivオペランドを使用するよりも優れているのですか?
あなたは32ビットに精通していますか? –
https://groups.google.com/forum/#!msg/comp.lang.asm.x86/BPkTrwLEgq8/_LbijZ5QD-cJ –
[定数による整数除算](http://blogs.msdn.com/b/) devdev/archive/2005/12/12/502980.aspx) –