gpt4 book ai didi

c - C中的汇编代码

转载 作者:太空宇宙 更新时间:2023-11-04 02:53:34 24 4
gpt4 key购买 nike

我正在尝试将汇编代码放入我的 C 函数中。此函数的目的是将存储在 src 地址中的值复制到 dst 地址:

void copy(int *dst, int *src);

我实际有问题的代码:

void copy(int *dst, int *src)
{
asm("mov %1, %2"
: /* no output */
: "i" (dst),
"i" (src)
: ""
);
}

给我错误:

test.c: 在函数‘copy’中:
test.c:29: 错误:‘asm’ 中的未知寄存器名称‘’
test.c:29: 警告:asm 操作数 0 可能与约束不匹配
test.c:29: 警告:asm 操作数 1 可能与约束不匹配

第29行是这一行:
asm("mov %1, %2"

编辑:

asm("mov %0, %1"
: "=m" (dst)
: "m" (dst),
"m" (src)
: ""
);

现在给我:
错误:“asm”中的未知寄存器名称“”我不知道如何处理最后一部分。

EDIT2

我读到我不能移动内存->内存,我需要使用寄存器。而且我还需要使用 AT&T 语法,所以它就像“mov src,dest”。下面的代码可以编译,但不幸的是,dst 指向的地址中的值是 0,而不是我放入 src 指向的地址中的值。

asm("movl %1, %%eax \n\t"
"movl %%eax, %0 \n\t"
: "=m" (dst)
: "m" (dst),
"m" (src)
);

EDIT3

我是这样做的(更改了参数),现在可以使用了:

void copy(int *dst, int *src, int n)
{
int a = *src;
int b = *dst;
asm("movl %1, %%eax\n"
"movl %%eax, %0\n"
: "=m" (b)
: "m" (a)
);
*src = a;
*dst = b;
}

最佳答案

您的 clobber 部分中有一个空条目。你不需要那个。

试试这个:

asm("mov %0, %1"
: "=m" (dst)
: "m" (dst),
"m" (src)
/* no clobbers */
);

该代码与此完全等价:

*dst = *src

所以我认为这只是一个小例子?

代码编译,但给出:

t.c: Assembler messages:
t.c:2: Error: too many memory references for `mov'

所以我认为您的汇编程序指令需要改进,但编译器语法没问题。

关于c - C中的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19681160/

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