相关疑难解决方法(0)

模数(%)的GCC实现如何工作,为什么不使用div指令?

我试图弄清楚如何在汇编中计算模10,所以我在gcc中编译了以下c代码,看看它是什么产生的.

unsigned int i=999;
unsigned int j=i%10;
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,我得到了

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)
Run Code Online (Sandbox Code Playgroud)

其中-4(%ebp)或"i"是输入,-12(%ebp)或"j"是答案.我已经测试了这个,无论你做出什么数字,它都能正常工作-4(%ebp).

我的问题是这个代码是如何工作的,它比使用div操作数更好.

optimization x86 assembly gcc

18
推荐指数
2
解决办法
1万
查看次数

标签 统计

assembly ×1

gcc ×1

optimization ×1

x86 ×1