1 / 24

가상기계와 코드생성

가상기계와 코드생성. CODE. STORE. PC. SP. 메모리 구조. 두 종류의 메모리 코드 메모리 – 데이터 메모리 레지스터 PC: 현 명령어의 위치 SP: 스택의 꼭대기 범용 레지스터는 없음. 명령어의 실행. 실행 사이클 do PC := PC + 1; execute the instruction in CODE[PC-1] od 명령어의 실행 스택을 이용한 연산 ( 범용 레지스터가 없으므로 ) 오퍼랜드와 연산 결과를 스택에 저장. 수치연산 명령어. 수치연산

Télécharger la présentation

가상기계와 코드생성

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 가상기계와 코드생성

  2. CODE STORE PC SP 메모리 구조 • 두 종류의 메모리 • 코드 메모리 – 데이터 메모리 • 레지스터 • PC: 현 명령어의 위치 • SP: 스택의 꼭대기 • 범용 레지스터는 없음

  3. 명령어의 실행 • 실행 사이클 do PC := PC + 1; execute the instruction in CODE[PC-1] od • 명령어의 실행 • 스택을 이용한 연산 (범용 레지스터가 없으므로) • 오퍼랜드와 연산 결과를 스택에 저장

  4. 수치연산 명령어 • 수치연산 • 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]

  5. 논리연산 명령어 • 논리연산 • 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]

  6. 비교연산 명령어 • 비교연산 • 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

  7. 메모리연산 명령어 • 적재연산 • 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

  8. 코드생성 • 코드생성 방법 • AST를 순회하면서 코드를 생성 • 순회방법: 후위(postorder) 순회 • 코드생성 함수 • 문장을 위한 함수: code() • 변수를 위한 함수: codeL() • 수식을 위한 함수: codeR()

  9. TIMES PLUS NAME NUMBER NUMBER a 3 1 순회순서 코드생성의 예 ldo (a) ldc 1 add ldc 3 mul (a+1)*3

  10. 코드생성 규칙 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 >=, >, <=, <, !=

  11. 코드생성 함수의 적용 예 (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

  12. 제어이동 명령어 • 제어이동 • ujp a PC := a • fjp a if STORE[SP] = false then PC := a; SP := SP - 1

  13. 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:

  14. code(x=e1) codeR(e) codeR(xe2) 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:

  15. 코드생성 함수의 적용 예 (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: = ...

  16. 수 반 환 값 제 어 링 크 반 환 주 소 매개 변수 지역 변수 임시 스택 프로시져의 활성레코드 • FP: 활성레코드의 시작 위치를 저장하는 레지스터 FP SP

  17. 지역변수의 위치 • 매개변수 (parameters) • i번째: FP+2+i • 지역변수 (local variables) • i번째: FP+2+p+i • p: 매개변수의 개수 • 변수의 주소 • 심볼테이블에 저장 • FP내에서의 상대주소를 저장

  18. 지역변수 접근 명령어 • 지역변수 접근 • 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)

  19. 프로시져/함수 호출 명령어 • 활성레코드 조작 • 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

  20. 프로시져/함수 반환 명령어 • 반환 명령어 • retf SP := FP; PC := STORE[FP+2]; FP := STORE[FP+1] • retp SP := FP - 1; PC := STORE[FP+2]; FP := STORE[FP+1]

  21. 프로시져의 번역 • 프로시져 호출 code(call name(p1, …, pn))  mst; codeR(p1); …; codeR(pn); cupnlname • 프로시져 정의 code(proc name(param) vardecl; body)  lname:sspp+v+2; code(body); retp

  22. 함수의 번역 • 함수 호출 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

  23. main의 번역 • main 정의 code(main vardecl; body)  sspv+2; code(body); stp

  24. 입출력 명령어 • 입력 함수 i = read(); • 출력 프로시져 write(i); • 입출력 명령어 • in SP := SP + 1; STORE[SP] := ‘input device’ • out ‘output device’ := STORE[SP]; SP := SP - 1

More Related