2013-05-14 5 views
0

어셈블리를 작성 중이므로 서브 루틴을 사용하려고하는데 문제가 있습니다. 스위치 케이스와 유사한 루틴을 작성했습니다. 그것은 입력을 읽고 값에 따라 다음 서브 루틴의 주소를 스택의 예약 된 주소에 기록합니다.PDP-11 어셈블리의 서브 루틴

1000 jsr r5,switchcase 
    // let the return address be 1004 
1004 jsr r5,@0(sp) 

첫 JSR 스택의 첫 번째 주소로 기록하는 스위치 케이스에 간다 :

그것은 다음과 같이 보입니다. 두 번째 주소는 해당 주소로 점프합니다.

나는 시뮬레이터를 사용하고 있으며, 그 라인에 도달 할 때마다 멈춰 버린다. 나는 무엇이 잘못되는지를 모른다 :/

어떤 도움을 주시면 감사하겠습니다.

+1

'jsr'이 스택에 반환 값을 푸시하여 사용하게되는 오프셋을 변경한다는 사실을 고려하고 계십니까? –

+0

@ 마크 랜섬 : 사실, jsr r5, ... 스택에 r5를 푸시 한 다음 현재 PC를 r5에 할당합니다. –

답변

0

명령어 jsr r5,@0(sp)은 이전 r5을 스택에 넣고 현재 R7 (PC)을 r5에 넣습니다. 따라서 프로그램은 스택의 주소로 이동하지 않고 r5에 저장된 주소로 이동합니다.
예에서 첫 번째 jsr 명령어는 r5을 스택에 쓴 다음 1004r5에 할당합니다.
EDIT : rts으로 프로그램이 돌아 오면 스택에서 이전 값 r5을 복원합니다.
두 번째 jsr 명령어는 다시이 값을 스택으로 푸시 한 다음 스택의 맨 위에 있으므로 (거리 0)이 주소로 점프합니다.
첫 번째 jsr이라는 서브 루틴이 실제로 스택 맨 위에 서브 루틴 주소를 남기고 두 번째 jsr이 점프해야한다면 대신 jsr r5,@2(sp)을 사용해야합니다. 그러나 나는 이것을 좋은 프로그래밍 스타일이 아닌 다른 모든 것으로 간주 할 것이다.
희망이 이번에는 바로 ...

+1

하지만 두 번째 jsr도 r5에 1008을 쓰지 않습니까? 또한 첫 번째 서브 루틴에서 반환 스택을 해결해야합니다. – JeremyP

+0

@JeremyP : 당신은 완전히 옳았습니다. 이것을 지적 해 주셔서 감사합니다. 죄송합니다. 저는 30 년 전에 PDP11 프로그래밍을했습니다 ... 나는 그것을 해결하기 위해 내 대답을 편집 할 것입니다. –