어셀블러 코드좀 봐주실분을 찾습니다. 흑흑 어셈은 너무 어려워
글쓴이: diah / 작성시간: 수, 2003/11/05 - 11:38오전
#define __down_op(ptr,fail) \
({ \
__asm__ __volatile__( \
"@ down_op\n" \
" mrs ip, cpsr\n" \
" orr lr, ip, #128\n" \
" msr cpsr_c, lr\n" \
" ldr lr, [%0]\n" \
" subs lr, lr, %1\n" \
" str lr, [%0]\n" \
" msr cpsr_c, ip\n" \
" movmi ip, %0\n" \
" blmi " SYMBOL_NAME_STR(fail) \
: \
: "r" (ptr), "I" (1) \
: "ip", "lr", "cc"); \
})
위에 코드가 무슨 역활을 하는지 알고 싶습니다.
위치는 커널 소스내에서 /include/asm/proc-armv/locks.h 안에 들어 있거든요
어셈블러에 약하다보니 저넘들이 도대체 뭔일들을 하고 있느지 답답하네요.
아무것도 해보지도 않고 이렇게 도움만 바래서 죄송합니다.
일단 글을 올려놓고 저도 연구좀 할게요.
여러분 부탁합니다.
Forums:
ARM RISK 어셈블리를 잘 몰라서 해석은 못했구요...인텔어셈블리
ARM RISK 어셈블리를 잘 몰라서 해석은 못했구요...
인텔어셈블리로 하면 아래와 같은코드네요.
__asm__ __volatile__(
"# atomic down operation\n\t"
LOCK "decl %0\n\t" /* --sem->count */
"js 2f\n"
"1\n"
LOCK_SECTION_START("")
"2\tcall __down_failed\n\t"
"jmp 1b\n"
LOCK_SECTION_END
"=m" (sem->count)
"c" (sem)
"memory");
풀어보면...
LOCK decl (sem->count)
js 2f
1
.subsection 1
extra
.ifndef " LOCK_SECTION_NAME "
.text.lock. __stringify(KBUILD_BASENAME)
.endif
2 call __down_failed # 이코드는 arch/i386/kernel/semaphore.c
jmb 1b
.previous
----- 이상이 인텔버전. 이해하려면 어셈지식약간과 링커지식이 있어야겠죠..
__asm__ __volatile__( \
"@ down_op\n" \
" mrs ip, cpsr\n" \
" orr lr, ip, #128\n" \
" msr cpsr_c, lr\n" \
" ldr lr, [%0]\n" \
" subs lr, lr, %1\n" \
" str lr, [%0]\n" \
" msr cpsr_c, ip\n" \
" movmi ip, %0\n" \
" blmi " SYMBOL_NAME_STR(fail) \
\
"r" (ptr), "I" (1) \
"ip", "lr", "cc");
이게 올려주신 암리스크버전.
풀어볼까요?
@ down_op # 잘 모르지만 아마 down_op라는 설명
mrs ip, cpsr
orr lr, ip, #128
msr cpsr_c, lr
ldr lr, [ptr] # ptr변수를 lr로 넣은후 1을 빼서 다시 ptr로 저장
sub lr, lr, %1
str lr, [ptr] # 인텔에선 이 3줄이 LOCK decl (sem->count)
msr cpsr_c, ip
movmi ip, ptr
blmi SYMBOL_NAME_STR(fail)
이렇게 풀어볼 수 있겠네요.
첫부분은 LOCK을 거는부분
두번째 부분은 1을 빼는부분
세번째 부분은 LOCK을 푸는부분
네번째 부분은 lock을 실패했을때 실패에대한 처리 펑션으로 점프하는 부분
이 되겠지요..
심심해서 번역해봤지만 제발 이런식의 질문은... RTFM입니다.!!!!
댓글 달기