가상기계와 코드생성
Download
1 / 24

가상기계와 코드생성 - PowerPoint PPT Presentation


  • 194 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 가상기계와 코드생성' - conan-gilmore


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

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(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:


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


ad