문자열의 부분 문자열을 gcc 인라인 어셈블리로 가져 오는 코드를 작성합니다. 나는 길이가 8. 여기에 코드substring-c 인라인 어셈블리 코드
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 코드가 있는데 문자열을 종료하는 것을 잊어 버렸습니다. 선인장과 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;
}
어디에서 작동하지 않습니까? 내가 문자열을 올바르게 null로 끝내지 않았기 때문에 아무 것도 없다고 가정 할 수 있습니다. 이는 운좋게도 작동한다는 것을 의미합니다. – cactus1
정말 고마워요. 그러나 eidx-sidx = 8 일 때만 문제가 발생한다는 것은 흥미 롭습니다. 이는 원하는 부분 문자열의 길이가 8이라는 것을 의미합니다. 그렇지 않으면 운좋게 작동합니다. 나는 아직도 이것을 알 수 없다. – Jianchen