2009-11-01 4 views
1

C로 인라인 어셈블리를 작성하려고합니다. 두 개의 배열을 입력으로 사용하고 있는데, array1의 한 요소를 array2로 복사하는 것이 필요하며 다음은 현재 가지고있는 내용입니다.C 인라인 어셈블리 메모리 복사본

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) 
); 

왜 분류 오류가 발생합니까?

+1

파서가 작동하면 HTML 사전 태그 추가가 중단됩니다. 그렇게하면 강조 표시가 삭제됩니다. –

+4

배열의 한 요소를 다른 배열로 복사하고 있습니까? 이것은 어셈블리 최적화가 도움이 될만한 것 같지 않습니다. –

+2

어셈블리에서 왜 이렇게하고 싶은지에 대한 자세한 정보를 추가해야합니다. 그렇지 않으면 "왜 귀찮은 것입니까?" 답변. –

답변

5

인라인 어셈블러 코드가 손상되었습니다. 당신은 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 파일에 넣는 것이 좋습니다. 훨씬 쉬워졌습니다.

+0

감사합니다, 이것은 내가 필요한 것입니다. MIPS32 및 MIPS64 명령어 중 일부만 알고 있기 때문에 처음으로 인라인 어셈블리를 작성합니다. Btw는 는, I는 AT & T에서의 movl 명령 너무 되어야 EAX에 배열 1에서 제 DWORD 읽어 의 movl 소스, 목적지 생각 "의 movl (% 0) %% EAX에 \ n의 \의 t" 은 바로인가? – user200340

+0

수 있습니다 .. 나는 항상이 AT & T 문법을 피하려고 노력합니다. 인텔 문법은 훨씬 더 깨끗합니다. –

+0

예, AT & T 문법은'source','dest'입니다 - 작은 수정을했습니다. – caf

3

당신의 최선의 선택은 C 코드 :

target_array[target_idx] = source_array[source_idx]; 

이 한 인덱스를 통제하에으로 세그멘테이션 오류를 피할 수 있습니다.

0

memcpy는 어떨까요?

관련 문제