질문할때는 다음 사항을 정확히 설명해주셔야 답변하시는 분도 최대한 정답에 가깝게 답할 수 있습니다.
---------------------------------------------------------------------------------------------------------------------------------------------------------
1. 컴파일러등의 개발환경 :
2. 회로나 소스코드의 제어목적 :
3. 증상과 예상되는 문제점 :
4. 기타 :
---------------------------------------------------------------------------------------------------------------------------------------------------------
학교에서 keil 공부하고 있는데요.
0200 ORG 200
0200 BACK : MOV A, #55H
0202 MOV P1, A
0204 MOV R4, #99H
0206 MOV R5, #67H
0208 LCALL DELAY
020B MOV A, #0AAH
이하생략
이 코드에서 LCALL 후에 STACK 이 어떻게 되어 있는지 잘 이해가 안됩니다.
0B
0A
09 02
08 0B
0B는 이해가 됩니다. 근데 그 다음에 02 라고 한거 같은데 이해가 잘 안되요
설명 부탁드립니다.
있는 그대로 이해하면 됩니다. LCALL DELAY를 실행하게 되면, DELAY라고 하는 서브루틴을 호출하게 되지요.
그 서브루틴의 실행이 끝나고 RET 명령어를 만나서 돌아오게 될 ADDRESS, 즉 LCALL DELAY 바로 다음 인스트럭션의 ADDRESS가 스택에 저장되게 됩니다. 그 ADDRESS가 020B이지요. 그런데, 이 ADDRESS는 16 비트 즉 2 바이트인데 스택에는 한 바이트씩만 저장할 수 있지요. 그래서 스택의 연속하는 두 위치에 연속하여 이 ADDRESS의 상위 바이트, 하위 바이트를 저장하는 것입니다. 8051 매뉴얼에 보시면 아시겠지만, RETURN ADDRESS는 하위바이트가 먼저, 상위 바이트가 나중에 저장됩니다. LCALL DELAY 실행 직후의 스택포인터 SP의 값은 09를 가리키게 됩니다.