我編寫了一個代碼,該函數通過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
任何想法子總是問題?????
感謝您的回覆。這是substring的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;
}
哪裏不能工作..?如果有什麼我會認爲這是因爲你不是空的 - 正確地終止字符串,這意味着它有點幸運,它可以工作。 – cactus1
非常感謝。但有趣的是,問題只發生在eidx-sidx = 8時,這意味着期望的子字符串的長度是8,否則它很幸運。我仍然無法確定。 – Jianchen