相关疑难解决方法(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万
查看次数

Java - 在同一步骤中获得商和余数?

似乎为了在 Java 中找到除法的商和余数,必须这样做:

int a = ...
int b = ...

int quotient = a / b;
int remainder = a % b;
Run Code Online (Sandbox Code Playgroud)

有没有办法写这个,以便在一个步骤(一个除法运算)中找到商和余数?或者 Java 是否已经自动优化了这些代码?

java integer-division

5
推荐指数
1
解决办法
5361
查看次数

如何在摩托罗拉M6800的汇编中使用mod的数字

如何在摩托罗拉M6800的程序集中使用数字的mod,例如%9.请告诉我应该使用哪些助记符.

assembly motorola

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

标签 统计

assembly ×2

integer-division ×2

c ×1

gcc ×1

java ×1

motorola ×1

x86-64 ×1