我一直在阅读div和mul组装操作,我决定通过在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) 似乎为了在 Java 中找到除法的商和余数,必须这样做:
int a = ...
int b = ...
int quotient = a / b;
int remainder = a % b;
Run Code Online (Sandbox Code Playgroud)
有没有办法写这个,以便在一个步骤(一个除法运算)中找到商和余数?或者 Java 是否已经自动优化了这些代码?
如何在摩托罗拉M6800的程序集中使用数字的mod,例如%9.请告诉我应该使用哪些助记符.