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
매우 (부전공 한) 코드 형식 문제를 해결하기 위해 질문을 편집했습니다. –