서브 루틴 내에서 서브 루틴을 호출 :ARM 어셈블리 적절한 서브 루틴에서 POP 링크 레지스터와 PC를 밀어 방법 내가 내 서브 루틴에서 다음을 수행 한</p> <p>는 ARM 어셈블리를 들어
SubRoutine:
PUSH {r1,r2,lr}
//code that changes r1 and r2
POP {r1,r2,lr}
bx lr
이인가 서브 루틴에서 돌아가서 주 함수에서 코드를 계속 사용하는 올바른 방법? 나는 사람들이 다음을 수행하는 것을 주위 보았다 :
SubRoutine:
PUSH {r1,r2,lr}
//code that changes r1 and r2
POP {r1,r2,pc}
bx lr
그러나 당신이 LR 밀어 때 PC를 POP 왜 모르겠어요. 올바른 방법과 이유는 무엇입니까? 당신이 서브 루틴 내에서 서브 루틴을 호출하는 경우
또한, 다음을 수행하십시오
SubRoutine:
PUSH {r1,r2,lr}
//code that changes r1 and r2
PUSH {lr}
bl AnotherRoutine (where bx lr will be used to return from it)
POP {lr}
POP {r1,r2,pc}
bx lr
또는 대신 다음과 같이 그것을 수행
SubRoutine:
PUSH {r1,r2,lr}
//code that changes r1 and r2
PUSH {lr}
bl AnotherRoutine(where bx lr will be used to return from it)
POP {pc}
POP {r1,r2,pc}
bx lr
설명서를 읽는 데 어려움이 있다면 ARMv5T 이후 목록에'pc'가있는'pop'이 인터 워킹 브랜치라는 것을 알 것입니다. 그 후에 결코 도달하지 않는'bxlr'. – EOF
"LR을 푸시 할 때 PC를 왜 POP하는지 모르겠다."---- 여기에 근본적인 것이 빠져있는 것처럼 들리 네요. LR__ 값을 푸시 한 다음 해당 값을 PC__에 힙니다 (따라서 해당 주소로 분기를 수행합니다). 당신은 asm 프로그래밍에 대한 몇 가지 기본을 읽을 필요가 있습니다. 인터넷에 많은 것들이 있습니다. –
잘 설명해 드리면 – SeesSound