gpt4 book ai didi

c - 将指针从 c 传递到 asm 并将值添加到 sse 寄存器

转载 作者:行者123 更新时间:2023-11-30 17:51:09 26 4
gpt4 key购买 nike

我想在 C 和 ASM 代码之间传递指向数组的指针。我有一个由四个 double 值组成的数组,我需要将它们传递给 asm,将它们加载到 xmm,相乘并将指向四个值的指针返回到 C。将数据加载到 xmm0 时出现错误。

如何将此指针传递给 ASM 并返回给 C ?如何将所有四个数字加载到 xmm0 ?

这是代码:

.text

.globl calkasse
.type calkasse, @function

calkasse:
pushq %rbp
movq %rsp, %rbp

movq 8(%rbp), %rax
movaps 16(%rax), %xmm0
mulps %xmm0,%xmm0

movq %rbp, %rsp
popq %rbp
ret

和 C 代码:

double (*calkasse(double (*)[4]))[4];

int main(void) {

double suma=0.0;
double poczatek=1.0;
double koniec=5.0;
double step=0.001;
double i=poczatek;
double array[4];
double (*wynik)[4];

array[0] = i;
array[1] = i+step;
array[2] = i+(2*step);
array[3] = i+(3*step);
wynik = calkasse(&array);
suma+=*wynik[0]+*wynik[1]+*wynik[2]+*wynik[3];
return 1;
}

最佳答案

您需要将项目编译为程序集文件,然后进行这些更改。如果您使用内联汇编,会发生的情况是,C 代码和内联汇编之间的系统会发生大量更改(我的意思是我在测试中看到的大量更改)。基本上,它会破坏系统在进入组装部分之前所看到的状态。原因很明显,因为您的 C 代码必须使用 C 库才能弄清楚内联汇编的含义。因此,在此期间你的持久性将被破坏,并且值将被推送和弹出。

为了在进入程序集之前不破坏寄存器,您可以尝试在程序集创建后将其添加到目标文件中。在开始添加代码之前,您可以使用 GDB 来弄清楚代码正在做什么,并且您应该能够手动获取您正在查找的地址,然后您可以将其放入变量中。我会将其放置在变量中,因为如果将其插入寄存器中,则必须在添加代码后跟踪程序集,以确保在正确的时间将其放置在正确的寄存器中。如果将其放置为变量,则可以使用 mov 指令(或 leal IIRC)将指针值获取到变量中,然后在 C 代码中,只需将此变量设置为 null 即可。然后,您可以在实际手动编写程序集之前编写 C 代码(基本上该变量是模拟)。希望这有帮助,祝你好运。

关于c - 将指针从 c 传递到 asm 并将值添加到 sse 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16844023/

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