매개변수가 여럿 있는 경우

pha, pla

pha: A 레지스터 값을 스택에 push 할 때 사용

  1. A 레지스터 값을 스택으로 push
  2. 스택 포인터 1 감소

pha — Push Accumulator

모드: i | opcode: $48 | 바이트: 1 | 사이클: 3

pla: 스택에서 A 레지스터로 pop 할 때 사용

  1. 스택에서 A 레지스터로 pop
  2. 스택 포인터 1 증가

pla — Pull Accumulator

모드: i | opcode: $68 | 바이트: 1 | 사이클: 4

상세 동작표: pha

묵시적 주소지정 모드로 동작한다.

클럭주소 버스PC++?데이터 버스외부 연산내부 연산
1offset 0증가$48Fetch $48
2offset 1opcode2Fetch opcode2Decode $48
3$01FFAPush A스택 포인터 감소
4offset 1증가opcode2Fetch opcode2
  • 클럭 1: pha의 opcode $48Fetch한다.
  • 클럭 2: $48Decode하면서 다음 명령어의 opcode를 미리 읽는다. 피연산자가 없으므로 바로 다음 주소를 읽는다.
  • 클럭 3: 주소 버스에 스택 주소를 놓고 A 레지스터 값을 스택에 Push한다. 스택 포인터가 감소한다.
  • 클럭 4: 다음 명령어의 opcode를 Fetch한다. 파이프라인으로 겹치므로 pha3사이클로 계산한다.

상세 동작표: pla

묵시적 주소지정 모드로 동작한다.

클럭주소 버스PC++?데이터 버스외부 연산내부 연산
1offset 0증가$68Fetch $68
2offset 1opcode2Fetch opcode2Decode $68
3$01FEbyteFetch byte스택 포인터 증가
4$01FFbyteFetch byte
5offset 1증가opcode2Fetch opcode2A = byte
  • 클럭 1: pla의 opcode $68Fetch한다.
  • 클럭 2: $68Decode한다.
  • 클럭 3: 현재 스택 포인터가 가리키는 주소에서 값을 읽지만 무시된다. 스택 포인터가 증가한다.
  • 클럭 4: 증가된 스택 포인터 주소에서 실제 값을 Fetch한다.
  • 클럭 5: 다음 명령어의 opcode를 Fetch하면서 A 레지스터에 값을 저장한다. 파이프라인으로 겹치므로 pla4사이클로 계산한다.

plapha보다 1사이클 더 걸리는 이유

스택 포인터가 다음 빈 위치를 가리키기 때문에, top을 읽으려면 스택 포인터를 먼저 증가시키는 데 1사이클을 추가로 소모한다.

매개변수가 여럿 있는 경우

호출자(caller)가 인자를 차례대로 스택에 push하고, 함수에서는 그 인자를 반대순서로 pop하여 사용한다.

예: func(10, 20, 30)

방법 1: 인자를 왼쪽에서 오른쪽으로 push하는 경우 (10 → 20 → 30)

  • 함수 안에서는 30, 20, 10 순서로 pop된다.

방법 2: 인자를 오른쪽에서 왼쪽으로 push하는 경우 (30 → 20 → 10)

  • 함수 안에서는 10, 20, 30 순서로 pop된다.

호출 규약

호출자와 함수 사이에 순서에 대한 합의가 있어야 한다. 함수가 인자들을 언제나 확실히 찾을 수 있어야 한다. 규약만 동일하면 어느 방법이든 문제없다.

예: 매개변수가 여럿 있는 경우

오른쪽에서 왼쪽으로 넣는 규약을 사용한다.

  • lda #3phalda #2phalda #1jsr func 순서로, 함수 안에서는 왼쪽부터 오른쪽 순서(1, 2, 3)로 접근할 수 있다.

우선 스택에서 회귀 주소를 먼저 pop해 임시 저장하고, 그 아래의 인자를 pop한다.

인자는 왼쪽에서 오른쪽 순(pla ; 1pla ; 2pla ; 3)으로 pop하여 사용한다.

인자 3개와 회귀 주소를 모두 스택에 복구한 뒤 rts로 돌아간다.

  • rts에서 회귀 주소가 pop되어 스택 포인터는 2 증가하지만, 인자 3개는 여전히 스택에 남아있다.

호출자가 pla를 3번 호출해서 스택에 넣은 인자를 제거한다.

호출자가 스택을 정리하는 것도 호출 규약

이 예에서는 호출자가 스택을 정리하지만, 함수 내부에서 정리하는 규약도 있다.