相关疑难解决方法(0)

'asm','__ asm'和'__asm__'有什么区别?

据我所知道的,唯一的区别__asm { ... };,并__asm__("...");是第一个使用mov eax, var第二个使用movl %0, %%eax:"=r" (var)结尾.还有什么其他差异?那又怎么样asm

c assembly gcc inline-assembly visual-c++

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

在C++内联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)

c++ x86 assembly red-zone

13
推荐指数
1
解决办法
4119
查看次数

如何使用Intel语法内联汇编在GCC中设置变量?

为什么这段代码没有设置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 inline-assembly intel-syntax

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

使用单个divl指令的除法和模数(i386,amd64)

我试图为gcc提供内联汇编以使用单divl指令获得除法和模数.不幸的是,我在集会上并不擅长.有人可以帮我这个吗?谢谢.

assembly gcc x86-64 division i386

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

一个大整数如何除以另一个大整数?

最近几天我一直在研究这个,但我一直无法找到答案。我想出了一种算法,如果除数只有一个词,它就可以工作。但是,如果除数是多个词,那么我会得到一些奇怪的答案。我知道这个问题在这里已经被问过几次了,但是除了使用教科书方法或去买一本关于这个主题的书外,没有明确的答案。除了除法之外,我已经能够让我的大整数库中的每个函数都可以工作。似乎有些人认为大整数除法是一个 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 除法

还有一堆关于这个主题的学术论文。

到目前为止我尝试过的:

我有一个基本的例程工作,但它将多字大整数除以单个字。我曾尝试实现 Newton-Raphson 算法,但这不起作用,因为我得到了一些非常奇怪的结果。我从它所基于的微积分中知道牛顿的方法,但这是整数数学而不是浮点数。我了解 Goldschmidt 除法算法背后的数学原理,但我不清楚如何用整数数学来实现它。其中一些算法的部分问题在于它们需要以 2 为底的对数函数。我知道如何使用浮点数和泰勒级数实现对数函数,但在使用整数数学时不知道。

我曾尝试查看GMP库,但除法算法没有很好的文档记录,而且有点超出我的想象。似乎他们在不同的点使用不同的算法,这增加了混乱。

对于学术论文,我主要了解数学(我已经清除了基本微积分数学,多变量微积分和常微分方程),但再次,我的数学知识和使用整数数学实现之间存在脱节。我已经看到有人建议使用小学方法,据我所知,该方法类似于移位减法方法,但我也不太确定如何实施该方法。有任何想法吗?代码会很好。

编辑: …

c algorithm math biginteger division

7
推荐指数
1
解决办法
4810
查看次数