문제

나는 인라인 어셈블리를 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는 어떻습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top