相关疑难解决方法(0)

为什么GCC在实现整数除法时使用乘以奇数的乘法?

我一直在阅读divmul组装操作,我决定通过在C中编写一个简单的程序来实现它们:

文件分割

#include <stdlib.h>
#include <stdio.h>

int main()
{
    size_t i = 9;
    size_t j = i / 5;
    printf("%zu\n",j);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后生成汇编语言代码:

gcc -S division.c -O0 -masm=intel
Run Code Online (Sandbox Code Playgroud)

但是看生成的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 …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64 integer-division

206
推荐指数
4
解决办法
1万
查看次数

积分运算符quot与div

Type类积分有两个操作quotdiv,但在哈斯克尔2010语种报告它没有规定他们应该做的事情.假设这div是不可分割的,有什么quot不同,或者目的是quot什么?你什么时候使用一个,而另一个?

haskell

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

为什么Math.DivRem效率低下?

在我的计算机中,此代码需要17秒(1000万次):

static void Main(string[] args) {
   var sw = new Stopwatch(); sw.Start();
   int r;
   for (int i = 1; i <= 100000000; i++) {
      for (int j = 1; j <= 10; j++) {
         MyDivRem (i,j, out r);
      }
   }
   Console.WriteLine(sw.ElapsedMilliseconds);
}

static int MyDivRem(int dividend, int divisor, out int remainder) {
   int quotient = dividend / divisor;
   remainder = dividend - divisor * quotient;
   return quotient;
}
Run Code Online (Sandbox Code Playgroud)

而Math.DivRem需要27秒.

.NET Reflector为我提供了Math.DivRem的代码:

public static int DivRem(int a, int b, out …
Run Code Online (Sandbox Code Playgroud)

.net optimization

34
推荐指数
3
解决办法
5688
查看次数

如何在一步中获得商和余数?

可能重复:同时
划分和获取剩余?

是否可以在一个步骤中同时得到整数除法的商和余数,即不进行两次整数除法?

c c++ modulo integer-division

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

模数(%)的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万
查看次数

执行除法和处理器模数的最佳方法是什么?

如何同时执行除法模数.处理器有可能吗?

喜欢 :

int a, b = 8 / 3; //a = 2, b = 2
Run Code Online (Sandbox Code Playgroud)

或者是否有比以下更好的操作:

int a = 8 / 3;
int b = 8 % 3;
Run Code Online (Sandbox Code Playgroud)

也许这更好?

int a = 8 / 3;
int b = 8 - a * 3;
Run Code Online (Sandbox Code Playgroud)

谢谢.

c c++ processor division modulo

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

标签 统计

c ×3

assembly ×2

c++ ×2

gcc ×2

integer-division ×2

modulo ×2

optimization ×2

.net ×1

division ×1

haskell ×1

processor ×1

x86 ×1

x86-64 ×1