2011-04-11 4 views
1

일부 ARM 인라인 어셈블러 코드를 만들었습니다.
Semaphore.s를 보면 gcc가 r3 레지스터를 사용하여 "success"와 "change"두 변수를 볼 수 있습니다. 내 제약 조건에 문제가 있는지 궁금합니다.
먼저 가장 관련 코드 라인 :GCC asm 인라인 제약 조건, 충돌하는 레지스터 할당

ASM 인라인 :

"1: MVN %[success], #0 @ success=TRUE=~FALSE\n\t" 
"LDREX %[value], %[signal] @ try to get exclusive access\n\t" 
"ADDS %[newValue], %[value], %[change] @ new value = value + change\n\t" 

제약 :

: [signal] "+m" (signal), [success] "=r" (success), [locked] "=r" (locked), [newValue] "=r" (newValue), [value] "=r" (value) 
: [borderValue] "r" (borderValue), [change] "r" (change) 
: "cc" 

심볼 파일 :

1: MVN r3, #0 @ success=TRUE=~FALSE 
LDREX r0, [r7, #12] @ try to get exclusive access 
ADDS r1, r0, r3 @ new value = value + change 

더 많은 소스와 생성 된 기호는 다음과 같습니다. 심볼 파일에서

BOOLEAN Semaphore_exclusiveChange (INT32U * signal, INT32S change, INT32U borderValue) 
{ 
BOOLEAN success; 
INT32U locked;// exclusive status 
INT32U newValue; 
INT32U value; 

asm (
"1: MVN %[success], #0 @ success=TRUE=~FALSE\n\t" 
"LDREX %[value], %[signal] @ new to get exclusive access\n\t" 
"ADDS %[newValue], %[value], %[change] @ new value = value + change\n\t" 
"ITE MI @ if (new value<0) \n\t" 
" SUBSMI %[newValue], %[newValue] @ (new value<0): new value=0, set zero flag \n\t" 
"@ else\n\t" 
" CMPPL %[newValue], %[borderValue] @ (new value>=0): if new value > border value \n\t" 
"\n\[email protected] zero flag is either: new value=0 or =bordervalue\n\t" 
"ITE HI @ if new signal level > border value \n\t" // 
" MOVHI  %[success], #0 @ fail to raise signal, success=FALSE \n\t" 
"\[email protected] else\n\t" 
" MOVLS  %[value], %[newValue] @ use new value \n\t" // ok 
"STREX %[locked], %[value], %[signal] @ new exclusive store of value\n\t" 
"TST %[locked],%[locked] @ is locked? \n\t" 
"IT NE @ if locked \n\t" 
"BNE 1b @ try again\n\t" 
"DMB @ memory barrier\n\t" // 

: [signal] "+m" (signal), [success] "=r" (success), [locked] "=r" (locked), [newValue] "=r" (newValue), [value] "=r" (value) 
: [borderValue] "r" (borderValue), [change] "r" (change) 
: "cc" ); 
return success; 
} 

관련 텍스트 :

당신은 더 '&'에 "성공"으로 제한 할 필요가
Semaphore_exclusiveChange: 
.LFB2: 
    .loc 1 10 0 
    @ args = 0, pretend = 0, frame = 32 
    @ frame_needed = 1, uses_anonymous_args = 0 
    @ link register save eliminated. 
    push {r7} 
.LCFI0: 
    sub sp, sp, #36 
.LCFI1: 
    add r7, sp, #0 
.LCFI2: 
    str r0, [r7, #12] 
    str r1, [r7, #8] 
    str r2, [r7, #4] 
    .loc 1 16 0 
    ldr r2, [r7, #4] 
    ldr r3, [r7, #8] 
@ 16 "../drivers/Semaphore.c" 1 
    1: MVN r3, #0 @ success=TRUE=~FALSE 
    LDREX r0, [r7, #12] @ new to get exclusive access 
    ADDS r1, r0, r3 @ new value = value + change 
    ITE MI @ if (new value<0) 
    SUBSMI r1, r1 @ (new value<0): new value=0, set zero flag 
    @ else 
    CMPPL r1, r2 @ (new value>=0): if new value > border value 

    @ zero flag is either: new value=0 or =bordervalue 
    ITE HI @ if new signal level > border value 
    MOVHI  r3, #0 @ fail to raise signal, success=FALSE 
     @ else 
    MOVLS  r0, r1 @ use new value 
    STREX r2, r0, [r7, #12] @ new exclusive store of value 
    TST r2,r2 @ is locked? 
    IT NE @ if locked 
    BNE 1b @ try again 
    DMB @ memory barrier 

@ 0 "" 2 
    .thumb 
    strb r3, [r7, #19] 
    str r2, [r7, #20] 
    str r1, [r7, #24] 
    str r0, [r7, #28] 
    .loc 1 38 0 
    ldrb r3, [r7, #19] @ zero_extendqisi2 
    .loc 1 39 0 
    mov r0, r3 
    add r7, r7, #36 
    mov sp, r7 
    pop {r7} 
    bx lr 
+0

매우 (부전공 한) 코드 형식 문제를 해결하기 위해 질문을 편집했습니다. –

답변

0

:에 '초기 소지품'으로 표시

: [signal] "+m" (signal), [success] "=&r" (success), [locked] "=r" (locked), [newValue] "=r" (newValue), [value] "=r" (value) 

합니다. 그렇지 않으면 컴파일러는 모든 입력이 소비 된 후 모든 출력이 생성 된 것으로 가정하고 다른 출력 및 입력에 대해 동일한 레지스터를 자유롭게 사용할 수 있습니다. "입력/출력"값이있는 경우 "반복 값"제약 조건을 사용해야합니다.

관련 문제