Я пытался выяснить, как рассчитать по модулю 10 в сборке, поэтому я скомпилировал следующий код c в gcc, чтобы узнать, что он придумал.
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.