240 likes | 497 Views
가상기계와 코드생성. CODE. STORE. PC. SP. 메모리 구조. 두 종류의 메모리 코드 메모리 – 데이터 메모리 레지스터 PC: 현 명령어의 위치 SP: 스택의 꼭대기 범용 레지스터는 없음. 명령어의 실행. 실행 사이클 do PC := PC + 1; execute the instruction in CODE[PC-1] od 명령어의 실행 스택을 이용한 연산 ( 범용 레지스터가 없으므로 ) 오퍼랜드와 연산 결과를 스택에 저장. 수치연산 명령어. 수치연산
E N D
CODE STORE PC SP 메모리 구조 • 두 종류의 메모리 • 코드 메모리 – 데이터 메모리 • 레지스터 • PC: 현 명령어의 위치 • SP: 스택의 꼭대기 • 범용 레지스터는 없음
명령어의 실행 • 실행 사이클 do PC := PC + 1; execute the instruction in CODE[PC-1] od • 명령어의 실행 • 스택을 이용한 연산 (범용 레지스터가 없으므로) • 오퍼랜드와 연산 결과를 스택에 저장
수치연산 명령어 • 수치연산 • add STORE[SP-1] := STORE[SP-1] + STORE[SP]; SP := SP - 1 • sub STORE[SP-1] := STORE[SP-1] - STORE[SP]; SP := SP - 1 • mul STORE[SP-1] := STORE[SP-1] * STORE[SP]; SP := SP - 1 • div STORE[SP-1] := STORE[SP-1] / STORE[SP]; SP := SP - 1 • neg STORE[SP] := - STORE[SP]
논리연산 명령어 • 논리연산 • and STORE[SP-1] := STORE[SP-1] and STORE[SP]; SP := SP - 1 • or STORE[SP-1] := STORE[SP-1] or STORE[SP]; SP := SP - 1 • not STORE[SP] := not STORE[SP]
비교연산 명령어 • 비교연산 • equ STORE[SP-1] := STORE[SP-1] = STORE[SP]; SP := SP - 1 • neq STORE[SP-1] := STORE[SP-1] STORE[SP]; SP := SP - 1 • geq STORE[SP-1] := STORE[SP-1] STORE[SP]; SP := SP - 1 • grt STORE[SP-1] := STORE[SP-1] > STORE[SP]; SP := SP - 1 • leq STORE[SP-1] := STORE[SP-1] STORE[SP]; SP := SP - 1 • les STORE[SP-1] := STORE[SP-1] < STORE[SP]; SP := SP - 1
메모리연산 명령어 • 적재연산 • ldo a SP := SP + 1; STORE[SP] := STORE[a] • ldc v SP := SP + 1; STORE[SP] := v • ind STORE[SP] := STORE[STORE[SP]] • 저장연산 • sro a STORE[a] := STORE[SP]; SP := SP - 1 • sto STORE[STORE[SP-1]] := STORE[SP]; SP := SP - 2
코드생성 • 코드생성 방법 • AST를 순회하면서 코드를 생성 • 순회방법: 후위(postorder) 순회 • 코드생성 함수 • 문장을 위한 함수: code() • 변수를 위한 함수: codeL() • 수식을 위한 함수: codeR()
TIMES PLUS NAME NUMBER NUMBER a 3 1 순회순서 코드생성의 예 ldo (a) ldc 1 add ldc 3 mul (a+1)*3
코드생성 규칙 code(x = e) codeL(x); codeR(e); sto codeL(x) ldc (x) codeR(x) codeL(x); ind codeR(c) ldcc codeR(e1 + e2) codeR(e1); codeR(e2); add similar for -, *, / codeR(-e) codeR(e); neg codeR(e1 = e2) codeR(e1); codeR(e2); equ similar for >=, >, <=, <, !=
코드생성 함수의 적용 예 (1) code(a = (a+1)*3) = codeL(a); codeR((a+1)*3); sto = ldc (a); codeR((a+1)*3); sto = ldc (a); codeR(a+1); codeR(3); mul; sto = ldc (a); codeR(a); codeR(1); add; codeR(3); mul; sto = ldc (a); codeL(a); ind; codeR(1); add; codeR(3); mul; sto = ldc (a); ldc (a); ind; codeR(1); add; codeR(3); mul; sto = ldc (a); ldc (a); ind; ldc1; add; codeR(3); mul; sto = ldc (a); ldc (a); ind; ldc1; add; ldc3; mul; sto
제어이동 명령어 • 제어이동 • ujp a PC := a • fjp a if STORE[SP] = false then PC := a; SP := SP - 1
codeR(e) fjp codeR(e) code(st1) fjp ujp code(st) code(st1) code(st2) code(st2) 제어 코드의 생성 (1) code(st1 ; st2) code(st1); code(st2) code(if e then st) codeR(e); fjpl; code(st); l: code(if e then st1 else st2) codeR(e); fjpl1; code(st1); ujpl2; l1: code(st2); l2:
code(x=e1) codeR(e) codeR(xe2) fjp fjp code(st) code(st) ujp code(x=x+1) ujp 제어 코드의 생성 (2) code(while (e) do st) l1:codeR(e); fjpl2; code(st); ujpl1; l2: code(for (x=e1 to e2) st) code(x=e1); l1: codeR(x<=e2); fjpl2; code(st); code(x=x+1); ujpl1; l2:
코드생성 함수의 적용 예 (2) code(while (a>b) begin c = c + 1; a = a - b end) = l1: codeR(a>b); fjp l2; code(c = c + 1; a = a - b); ujp l1; l2: = l1: codeR(a); codeR(b); grt; fjp l2; code(c = c + 1; a = a - b); ujp l1; l2: = l1: codeL(a); ind; codeL(b); ind; grt; fjp l2; code(c = c + 1; a = a - b); ujp l1; l2: = l1: ldc (a); ind; ldc (b); ind; grt; fjp l2; code(c = c + 1; a = a - b); ujp l1; l2: = l1: ldc (a); ind; ldc (b); ind; grt; fjp l2; code(c = c + 1); code(a = a - b); ujp l1; l2: = ...
함 수 반 환 값 제 어 링 크 반 환 주 소 매개 변수 지역 변수 임시 스택 프로시져의 활성레코드 • FP: 활성레코드의 시작 위치를 저장하는 레지스터 FP SP
지역변수의 위치 • 매개변수 (parameters) • i번째: FP+2+i • 지역변수 (local variables) • i번째: FP+2+p+i • p: 매개변수의 개수 • 변수의 주소 • 심볼테이블에 저장 • FP내에서의 상대주소를 저장
지역변수 접근 명령어 • 지역변수 접근 • lod a SP := SP + 1; STORE[SP] := STORE[FP+a] • lda a SP := SP + 1; STORE[SP] := FP + a • str a STORE[FP+a] := STORE[SP]; SP := SP - 1 • 코드 생성 규칙의 변경 codeL(x) lda (x)
프로시져/함수 호출 명령어 • 활성레코드 조작 • mst STORE[SP+2] := FP; SP := SP + 3 • cup p a FP := SP - (p+2); STORE[FP+2] := PC; PC := a • 스택포인터 조작 • ssp a SP := FP + a
프로시져/함수 반환 명령어 • 반환 명령어 • retf SP := FP; PC := STORE[FP+2]; FP := STORE[FP+1] • retp SP := FP - 1; PC := STORE[FP+2]; FP := STORE[FP+1]
프로시져의 번역 • 프로시져 호출 code(call name(p1, …, pn)) mst; codeR(p1); …; codeR(pn); cupnlname • 프로시져 정의 code(proc name(param) vardecl; body) lname:sspp+v+2; code(body); retp
함수의 번역 • 함수 호출 codeR(name(p1, …, pn)) mst; codeR(p1); …; codeR(pn); cupnlname • 함수 정의 code(func name(param) vardecl; body) lname:sspp+v+2; code(body); retf • 함수값 반환 code(return e) codeR(e); str 0; retf
main의 번역 • main 정의 code(main vardecl; body) sspv+2; code(body); stp
입출력 명령어 • 입력 함수 i = read(); • 출력 프로시져 write(i); • 입출력 명령어 • in SP := SP + 1; STORE[SP] := ‘input device’ • out ‘output device’ := STORE[SP]; SP := SP - 1