가상기계와 코드생성
This presentation is the property of its rightful owner.
Sponsored Links
1 / 24

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


  • 126 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

가상기계와 코드생성

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


6612619

가상기계와 코드생성


6612619

CODE

STORE

PC

SP

메모리 구조

  • 두 종류의 메모리

    • 코드 메모리 – 데이터 메모리

  • 레지스터

    • PC: 현 명령어의 위치

    • SP: 스택의 꼭대기

    • 범용 레지스터는 없음


6612619

명령어의 실행

  • 실행 사이클

    do

    PC := PC + 1;

    execute the instruction in CODE[PC-1]

    od

  • 명령어의 실행

    • 스택을 이용한 연산 (범용 레지스터가 없으므로)

    • 오퍼랜드와 연산 결과를 스택에 저장


6612619

수치연산 명령어

  • 수치연산

    • addSTORE[SP-1] := STORE[SP-1] + STORE[SP];

      SP := SP - 1

    • subSTORE[SP-1] := STORE[SP-1] - STORE[SP];

      SP := SP - 1

    • mulSTORE[SP-1] := STORE[SP-1] * STORE[SP];

      SP := SP - 1

    • divSTORE[SP-1] := STORE[SP-1] / STORE[SP];

      SP := SP - 1

    • negSTORE[SP] := - STORE[SP]


6612619

논리연산 명령어

  • 논리연산

    • andSTORE[SP-1] := STORE[SP-1] and STORE[SP];

      SP := SP - 1

    • orSTORE[SP-1] := STORE[SP-1] or STORE[SP];

      SP := SP - 1

    • notSTORE[SP] := not STORE[SP]


6612619

비교연산 명령어

  • 비교연산

    • equSTORE[SP-1] := STORE[SP-1] = STORE[SP];

      SP := SP - 1

    • neqSTORE[SP-1] := STORE[SP-1]  STORE[SP];

      SP := SP - 1

    • geqSTORE[SP-1] := STORE[SP-1]  STORE[SP];

      SP := SP - 1

    • grtSTORE[SP-1] := STORE[SP-1] > STORE[SP];

      SP := SP - 1

    • leqSTORE[SP-1] := STORE[SP-1]  STORE[SP];

      SP := SP - 1

    • lesSTORE[SP-1] := STORE[SP-1] < STORE[SP];

      SP := SP - 1


6612619

메모리연산 명령어

  • 적재연산

    • ldo aSP := SP + 1;

      STORE[SP] := STORE[a]

    • ldc vSP := SP + 1;

      STORE[SP] := v

    • indSTORE[SP] := STORE[STORE[SP]]

  • 저장연산

    • sro aSTORE[a] := STORE[SP];

      SP := SP - 1

    • stoSTORE[STORE[SP-1]] := STORE[SP];

      SP := SP - 2


6612619

코드생성

  • 코드생성 방법

    • AST를 순회하면서 코드를 생성

    • 순회방법: 후위(postorder) 순회

  • 코드생성 함수

    • 문장을 위한 함수: code()

    • 변수를 위한 함수: codeL()

    • 수식을 위한 함수: codeR()


6612619

TIMES

PLUS

NAME

NUMBER

NUMBER

a

3

1

순회순서

코드생성의 예

ldo(a)

ldc1

add

ldc3

mul

(a+1)*3


6612619

코드생성 규칙

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 >=, >, <=, <, !=


6612619

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


6612619

제어이동 명령어

  • 제어이동

    • ujp aPC := a

    • fjp aif STORE[SP] = false

      then PC := a;

      SP := SP - 1


6612619

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:


6612619

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:


6612619

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

= ...


6612619

매개

변수

지역

변수

임시

스택

프로시져의 활성레코드

  • FP: 활성레코드의 시작 위치를 저장하는 레지스터

FP

SP


6612619

지역변수의 위치

  • 매개변수 (parameters)

    • i번째: FP+2+i

  • 지역변수 (local variables)

    • i번째: FP+2+p+i

    • p: 매개변수의 개수

  • 변수의 주소

    • 심볼테이블에 저장

    • FP내에서의 상대주소를 저장


6612619

지역변수 접근 명령어

  • 지역변수 접근

    • lod aSP := SP + 1;

      STORE[SP] := STORE[FP+a]

    • lda aSP := SP + 1;

      STORE[SP] := FP + a

    • str aSTORE[FP+a] := STORE[SP];

      SP := SP - 1

  • 코드 생성 규칙의 변경

    codeL(x) lda (x)


6612619

프로시져/함수 호출 명령어

  • 활성레코드 조작

    • mstSTORE[SP+2] := FP;

      SP := SP + 3

    • cup p aFP := SP - (p+2);

      STORE[FP+2] := PC;

      PC := a

  • 스택포인터 조작

    • ssp aSP := FP + a


6612619

프로시져/함수 반환 명령어

  • 반환 명령어

    • retfSP := FP;

      PC := STORE[FP+2];

      FP := STORE[FP+1]

    • retpSP := FP - 1;

      PC := STORE[FP+2];

      FP := STORE[FP+1]


6612619

프로시져의 번역

  • 프로시져 호출

    code(call name(p1, …, pn)) 

    mst; codeR(p1); …; codeR(pn); cupnlname

  • 프로시져 정의

    code(proc name(param) vardecl; body) 

    lname:sspp+v+2; code(body); retp


6612619

함수의 번역

  • 함수 호출

    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


6612619

main의 번역

  • main 정의

    code(main vardecl; body) 

    sspv+2; code(body); stp


6612619

입출력 명령어

  • 입력 함수

    i = read();

  • 출력 프로시져

    write(i);

  • 입출력 명령어

    • inSP := SP + 1;

      STORE[SP] := ‘input device’

    • out‘output device’ := STORE[SP];

      SP := SP - 1


  • Login