gpt4 book ai didi

c - substring -- c 内联汇编代码

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

我编写了一段代码,使用 gcc 内联汇编获取字符串的子字符串。但是当我想获取长度为8的子字符串时总是会遇到问题。这是代码

static inline char * asm_sub_str(char *dest, char *src, int s_idx, int edix)
{
__asm__ __volatile__("cld\n\t"
"rep\n\t"
"movsb"
:
:"S"(src + s_idx), "D"(dest), "c"(edix - s_idx + 1)
);
return dest;
}

int main(int argc, char *argv[])
{

char my_string[STRINGSIZE] = "abc defghij";
char asm_my_sub_string[STRINGSIZE];

int sidx,eidx;

sidx = 0;
eidx = 5;
char *d1 = asm_sub_str(asm_my_sub_string, my_string, sidx, eidx);
printf("d1[%d-%d]: %s\n",sidx, eidx, d1);

sidx = 0;
eidx = 7;
d1 = asm_sub_str(asm_my_sub_string, my_string, sidx, eidx);
printf("d1[%d-%d]: %s\n",sidx, eidx, d1);

sidx = 0;
eidx = 9;
d1 = asm_sub_str(asm_my_sub_string, my_string, sidx, eidx);
printf("d1[%d-%d]: %s\n",sidx, eidx, d1);

}

这是输出

d1[0-5]: abc de
d1[0-7]: abc defg?
d1[0-9]: abc defghi

有什么想法吗?????

感谢回复。这是子字符串的 C 代码,我忘了以 null 终止字符串。感谢仙人掌和bbonev!希望其他人可以从这个线程中学习。

static inline char * sub_str(char *dest, char *src, int s_idx, int edix)
{
int length = edix - s_idx + 1;
int i;

for(i = 0; i < length; i++)
{
*(dest + i) = *(src + s_idx + i);
}
*(dest + length) = '\0';

return dest;
}

最佳答案

我想它不起作用,因为汇编代码不会 0 终止结果缓冲区。

我总是更喜欢带有起始位置和计数的子串语义,而不是两个位置。人们用这样的术语思考起来要容易得多。

这个函数不需要返回任何值。

static inline void asm_sub_str(char *dest, char *src, int s_idx, int count)
{
__asm__ __volatile__("cld\n"
"rep\n"
"movsb\n"
"xor %%al,%%al\n"
"stosb\n"
:
:"S"(src + s_idx), "D"(dest), "c"(count)
);
}

编辑:请注意,此实现虽然是用汇编语言编写的,但并不是最理想的。对于特定的体系结构,内存对齐和字大小对于速度很重要,执行复制的最佳方法可能是对齐机器大小的字。首先一个一个地复制 word size-1 个字节,然后复制 words 中的大部分字符串,最后完成最后一个 word size-1 个字节。

我把这个问题当作内联汇编和传递参数的练习,而不是复制字符串的最佳方法。对于现代 C 编译器,预计使用 -O2 将生成更快的代码。

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

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