gpt4 book ai didi

C内联汇编帮助(digital mars c编译器)

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:06 26 4
gpt4 key购买 nike

从头开始最后的编辑...它仍然无法正常工作,地址偏移量仍然以字节为单位,据我所知 >_<

我正在尝试用 C 编写我自己的任意精度整数运算的实现。为了高效地做到这一点,我需要使用内联汇编函数来访问进位标志,并访问高 32 位和低 32 位32bx32b 乘法的结果。

所以我写了这个函数,将两个 32 位整数 a 和 b 相乘,并将乘积的高位部分存储在 c 中,低位部分存储在 d 中。

void longMul(int a, int b, int *c, int *d) {
asm {
mov EAX, a
mul b
mov ESI, c
mov [ESI], EDX
mov ESI, d
mov [ESI], EAX
}

现在我从我的 BigInteger_Mul 函数中调用这个函数,其中 a 和 b 是指向整数数组的指针(这是我存储大整数的方式),i 和 j 是 a 和 b 的索引。 highPart 和 lowPart 存储相乘的结果。所以它在我的代码中看起来像这样(我省略了大部分代码,因为问题只涉及一行):

 void BigInteger_Mul( length, int *a, int *b, int *dest) {     
... do a bunch of stuff ...
int highPart, lowPart;
longMul( *(a+i), *(b+j), &highPart, &lowPart);
... do a bunch more stuff ...
}

我已经对其进行了测试,并且代码完全按照我的预期运行(...对于至少一组输入:P)。现在,我正尝试通过将 Mul 函数完全转换为汇编、内联所有函数调用和优化来提高 Mul 函数的效率。

所以我的第一步是替换这条线:

longMul( *(a+i), *(b+j), &highPart, &lowPart);

我认为功能上等效的汇编代码:

asm {
mov ESI, a
mov ECX, i
mov EAX, [ESI+ECX*4]

mov ESI, b
mov ECX, j
mul [ESI+ECX*4]

mov lowPart, EAX
mov highPart, EDX
}

而且我得到了完全错误的结果。那么,为什么第二个代码块的行为与第一个不同?请原谅我的笨拙,我没有 x86 汇编的背景,只是决定直接进入。这也可能是一个愚蠢的错误。

编辑:我刚刚发现内联汇编应该保留 ESI 寄存器。即使我将它的内容存储在一个变量中,然后在最后恢复它们,它似乎也无济于事。

最佳答案

不知道为什么您的代码不起作用。看起来不错,但我也得到了不好的结果。这是 lon-way around,但它对我有用:

asm {
mov EAX, j
mov EBX, 4
mul EAX, EBX
mov EBX, b
add EAX, EBX
mov ECX, EAX

mov ESI, a
mov EBX, i
mov EAX, [ESI+EBX*4]

mov ESI, ECX
mul [ESI]
mov lowPart, EAX
mov highPart, EDX
}

关于C内联汇编帮助(digital mars c编译器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23599416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com