C 인라인 어셈블리 메모리 사본
-
11-09-2019 - |
문제
나는 인라인 어셈블리를 C에 쓰려고 노력하고 있습니다. 입력으로 두 개의 배열이 있습니다. 필요한 것은 Array1의 하나의 요소를 Array2에 복사하는 것입니다. 다음은 현재 내가 가진 것입니다.
asm (
"movl %0,%%eax;"
"movl %1,%%ebx;"
"movl (%%eax),%%ecx;"
"movl %%ecx,(%ebx);"
"xor %%ecx,%%ecx;"
"movl 4(%%eax),%%ecx;"
//do something on %ecx
"movl %%ecx,4(%ebx);" //write second
:
:"a"(array1),"b"(array2)
);
세그먼트 화 결함을 얻는 이유는 무엇입니까?
해결책
인라인 어셈블러 코드가 고장났습니다. Clobber 목록에 추가하지 않고는 EAX와 EBX를 직접 사용할 수 없습니다. 그렇지 않으면 컴파일러가 이제 어떤 레지스터가 수정되었는지가 아닙니다.
당신이 수정 한 레지스터 중 하나에 나중에 분할 결함을 일으킨 중요한 것을 포함했을 가능성이 높습니다.
이 코드는 Array1에서 Array2로 하나의 요소를 복사합니다.
asm (
"movl (%0), %%eax \n\t" /* read first dword from array1 into eax */
"movl %%eax, (%1) \n\t" /* write dword into array2
: /* outputs */
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "eax", "memory"
);
적절한 레지스터 제약 조건을 갖춘 더 나은 버전은 다음과 같이 하드 코딩 된 EAX를 삭제합니다.
int dummy;
asm (
"movl (%1), %0 \n\t"
"movl %0, (%2) \n\t"
: /* outputs, temps.. */ "=r" (dummy)
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "memory"
);
BTW- 일반적으로 나는 당신이 아직 어셈블러에 익숙하지 않다는 느낌을 가지고 있습니다. 모든 컴파일러 마법으로 인해 인라인-어스블러를 작성하는 것이 조금 더 어렵습니다. 어셈블러에 간단한 기능을 작성하고 별도의 .S 파일에 먼저 넣는 것이 좋습니다. 훨씬 쉽습니다 ..
다른 팁
최선의 선택은 C 코드입니다.
target_array[target_idx] = source_array[source_idx];
이것은 인덱스가 제어되는 한 분할 결함을 피합니다.
Memcpy는 어떻습니까?
제휴하지 않습니다 StackOverflow