GCC为什么用奇数乘法来实现整数除法?我一直在读到div和mul程序集操作,我决定通过用C编写一个简单的程序来查看它们的运行情况:文件分割.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 RDX (?)mul rdx
; Multiply 9 by magic number
mov rax, rdx ; Take only the upper 64 bits of the result
shr rax, 2 ; Shift these bits 2 places to the right (?)mov QWORD PTR [rbp-8], rax
; Magically, RAX contains 9/5=1 now,
; so we can assign it to j这里发生了什么事?GCC为什么根本不使用div?它是如何产生这个神奇的数字的,为什么所有的东西都能工作呢?
3 回答
catspeake
TA贡献1111条经验 获得超0个赞
CCCCCCCCCCCCD
0.110011001100
0.CCCCCCCC...
0.110011001100...
0.001100110011...
0.111111111111...
0.9999999...
x + x/4 = 1
5x/4 = 1
, x=4/5
CCCCCCCCCCCCD
1
).
- 3 回答
- 0 关注
- 670 浏览
添加回答
举报
0/150
提交
取消