据我所知道的,唯一的区别__asm { ... };,并__asm__("...");是第一个使用mov eax, var第二个使用movl %0, %%eax与:"=r" (var)结尾.还有什么其他差异?那又怎么样asm?
我希望能够%rbp在内联asm中使用基指针寄存器().这样的玩具示例是这样的:
void Foo(int &x)
{
asm volatile ("pushq %%rbp;" // 'prologue'
"movq %%rsp, %%rbp;" // 'prologue'
"subq $12, %%rsp;" // make room
"movl $5, -12(%%rbp);" // some asm instruction
"movq %%rbp, %%rsp;" // 'epilogue'
"popq %%rbp;" // 'epilogue'
: : : );
x = 5;
}
int main()
{
int x;
Foo(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望,因为我使用通常的序幕/结尾函数调用方法来推送和弹出旧的%rbp,这样就可以了.但是,当我尝试在内x联asm之后访问时,它会出现故障.
GCC生成的汇编代码(略微剥离)是:
_Foo:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -8(%rbp)
# INLINEASM
pushq %rbp; // prologue
movq %rsp, …Run Code Online (Sandbox Code Playgroud) 为什么这段代码没有设置temp为1?我该怎么做呢?
int temp;
__asm__(
".intel_syntax;"
"mov %0, eax;"
"mov eax, %1;"
".att_syntax;"
: : "r"(1), "r"(temp) : "eax");
printf("%d\n", temp);
Run Code Online (Sandbox Code Playgroud) 我试图为gcc提供内联汇编以使用单divl指令获得除法和模数.不幸的是,我在集会上并不擅长.有人可以帮我这个吗?谢谢.
最近几天我一直在研究这个,但我一直无法找到答案。我想出了一种算法,如果除数只有一个词,它就可以工作。但是,如果除数是多个词,那么我会得到一些奇怪的答案。我知道这个问题在这里已经被问过几次了,但是除了使用教科书方法或去买一本关于这个主题的书外,没有明确的答案。除了除法之外,我已经能够让我的大整数库中的每个函数都可以工作。似乎有些人认为大整数除法是一个 NP 难题,并且由于我遇到的麻烦,我倾向于同意。
数据存储在一个结构中,该结构包含指向 uint16_t 或 uint32_t 数组的指针,具体取决于是否支持 long long 数据类型。如果不支持 long long,则 uint16_t 用于捕获乘法和加法运算中的任何进位/溢出。我目前拥有的函数是加法、减法、乘法、2 的补码否定、比较、和、或、异或、非、左移、右移、左旋转、右旋转、位反转(反射)、一些转换例程,随机数填充例程和其他一些实用例程。除除法外,所有这些都正常工作(我在计算器上检查了结果)。
typedef struct bn_data_t bn_t;
struct bn_data_t
{
uint32 sz1; /* Bit Size */
uint32 sz8; /* Byte Size */
uint32 szw; /* Word Count */
bnint *dat; /* Data Array */
uint32 flags; /* Operational Flags */
};
Run Code Online (Sandbox Code Playgroud)
这与我询问的关于内联汇编器的另一个问题有关,因为这就是它的用途。
到目前为止我发现了什么:
https://en.wikipedia.org/wiki/Division_algorithm
还有一堆关于这个主题的学术论文。
到目前为止我尝试过的:
我有一个基本的例程工作,但它将多字大整数除以单个字。我曾尝试实现 Newton-Raphson 算法,但这不起作用,因为我得到了一些非常奇怪的结果。我从它所基于的微积分中知道牛顿的方法,但这是整数数学而不是浮点数。我了解 Goldschmidt 除法算法背后的数学原理,但我不清楚如何用整数数学来实现它。其中一些算法的部分问题在于它们需要以 2 为底的对数函数。我知道如何使用浮点数和泰勒级数实现对数函数,但在使用整数数学时不知道。
我曾尝试查看GMP库,但除法算法没有很好的文档记录,而且有点超出我的想象。似乎他们在不同的点使用不同的算法,这增加了混乱。
对于学术论文,我主要了解数学(我已经清除了基本微积分数学,多变量微积分和常微分方程),但再次,我的数学知识和使用整数数学实现之间存在脱节。我已经看到有人建议使用小学方法,据我所知,该方法类似于移位减法方法,但我也不太确定如何实施该方法。有任何想法吗?代码会很好。
编辑: …
assembly ×3
gcc ×3
c ×2
division ×2
algorithm ×1
biginteger ×1
c++ ×1
i386 ×1
intel-syntax ×1
math ×1
red-zone ×1
visual-c++ ×1
x86 ×1
x86-64 ×1