인라인 어셈블러 코드가 손상되었습니다. 당신은 clobber 목록에 추가하지 않고 EAX와 EBX를 직접 사용할 수 없습니다. 그렇지 않으면 컴파일러는 어떤 레지스터가 수정되었는지 이제는 알지 못합니다.
수정 한 레지스터 중 하나에 나중에 세그먼트 결함이 발생한 중요한 항목이 포함되었을 가능성이 큽니다.
이 코드는 배열 2에 배열 1에서 하나 개의 요소를 복사합니다 :
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 파일에 넣는 것이 좋습니다. 훨씬 쉬워졌습니다.
파서가 작동하면 HTML 사전 태그 추가가 중단됩니다. 그렇게하면 강조 표시가 삭제됩니다. –
배열의 한 요소를 다른 배열로 복사하고 있습니까? 이것은 어셈블리 최적화가 도움이 될만한 것 같지 않습니다. –
어셈블리에서 왜 이렇게하고 싶은지에 대한 자세한 정보를 추가해야합니다. 그렇지 않으면 "왜 귀찮은 것입니까?" 답변. –