飛上

rabe.egloos.com

포토로그



어셈블러를 사용하여 간단한 인터프린터 프로그램 작성하기 by 재동이

개발환경

운영체제: WindowsXP
컴파일러: MSASM
디버거: VisualC++ 6.0
사용라이브러리: 어셈블리 언어 4판 (ASSEMBLY LAGUAGE FOR INTEL... 에서 제공하는 라이브러리

 

#과제 설명

 

간단한 스크립트 인터프리터를 만드는 것입니다.

컴파일러가 아닌 인터프리터입니다.

둘의 차이는 알고 계시리라 믿습니다.

어떠한 언어를 제대로 이해하고 있는지 확인할 수 있는 그 언어에 대한 번역기를 만들어보거나, 그 언어를 이용해서 다른 언어를 만들어보는 것도 도움이 되겠지요.

구현하시는 과정은 힘들겠지만 구현이 되고나면, 기존 과제에 비해 큰 성취감을 느끼실수 있을 것입니다.

소스 파일을 입력 받는 것에 대한 내용은 460 페이지에 예제가 나와 있으므로 이것을 참고하시면 되구요. 기본적으로 소스 파일의 내용을 전부 다 메모리 상에 Read한다고

가정하겠습니다. 책 460페이지에 나와있는 것을 보시면 아시겠지만 파일에서 읽어들이는 내용을 위해 buffer를 잡아놓게 되죠. 이것을 16KB(16384 bytes) 크기로 할당하시기 바랍니다.

일단 소스 코드가 메모리 상에 Load되면 이제 한줄 한줄씩 인터프리팅을 하시면서 실행이 되게 하시면 됩니다. string 같은 경우에는 선언과 정의가 동시에 이루어지는 때와 선언만 이루어지는 때가 있는데, 선언과 정의가 동시에 이루어지는 경우 스트링의 맨 마지막에 null string(0)을 추가해 주시기 바랍니다.

print()의 경우 다중 매개변수를 받게 되는데 이 때, 화면에 출력을 할 때 데이터 형에 따라서 WriteInt를 할 것인가, WriteString을 할 것인가를 정해주시면 되겠습니다.

여태까지 배워온 내용을 잘 숙지하고 계시다면 약간의 노력을 더해서

충분히 만들어내실 수 있는 과제입니다.

빠르게 구현하실 수 있으려면 설계를 짜임새 있게 하는 것이 중요합니다.

번역을 할 때 명령의 패턴을 살펴보시고 명령에 따른 번역 순서를

잘 정의해서 구현하시면 구현을 하는데 많은 도움이 될 것입니다.

이번 과제의 기한은 12월 23일 0시까지입니다.

 

-디렉티브

BEGIN - 프로그램의 시작

END - 프로그램의 끝

변수 선언 타입

string varname (array of bytes,null terminated)

int varname (4-byte signed)

nothing (void)

 

-미리 정의된 상수

\n : 캐리지 리턴/라인피드

 

-지원되는 명령

dst = src (move)

src + dst (addition)

src - dst (subtract)

src * dst (signed multiply)

src / dst (signed division)

print(arg1,arg2,arg3,...) - 화면상에 문자열 출력.

input(dst,n) - 키보드로부터 최대 n개의 문자를 입력받아서 dst에 저장.

 

////////////////////////////////////////////////////////////////////////////

// Example Script-x Source Code

////////////////////////////////////////////////////////////////////////////

BEGIN

string intro1 "This is test source code of my first interpreter.\n"

string intro2 "Please enter any string : "

string buf

int a,b,c

a = 20

b = 10

print(intro1)

print(intro2)

input(buf,128)

print("\n")

print("a is ")

print(a,"\n")

print("b is ")

print(b,"\n")

c = a + b

print("a + b : ")

print(c,"\n")

c = a - b

print("a - b : ")

print(c,"\n")

c = a * b

print("a * b : ")

print(c,"\n")

c = a / b

print("a / b : ")

print(c,"\n")

print("Finally you have entered '",buf,"'\n")

END

 

/////////////////////////////////////////////////////////

// 실행 및 출력 예

////////////////////////////////////////////////////////

c:\> interpreter.exe test-script-x.is

This is test source code of my first interpreter.

Please enter any string : My Assembly TA is devil!!

a is 20

b is 10

a + b : 30

a - b : 10

a * b : 200

a / b : 2

Finally you have entered 'My Assembly TA is devil!!'

 


1,전체 동작

  스크립트 소스파일을 메모리에 전부 저장합니다.

  메모리에 저장된 소스코드를 한 줄씩 읽어 와서 처리를 하게 됩니다.


2,변수 관리

  테이블을 하나만 사용하여 관리합니다.

  문자열 형태의 변수와 다른 변수와의 호환성을 위해 문자열의 길이를 최대 236Byte로 제    한하고 변수 하나당 255Byte의 공간을 차지하며, 공간할당은 아래와 같습니다.

  (1Byte는 타입(1=int,2=string,)+16Byte는 변수명+1Byte NULL+236Byte의

  변수 데이터(int형과 string형 공통)+1Byte의NULL 을 합쳐서 255Byte)

  값이 저장된 변수와 값이 저장되지 않은 변수를 따로 분류하지 않습니다.


3,산술 연산

  토큰으로 사용할문자를 NULL , space 로하여

  한줄이 몇 개의 토큰으로 구성되어있는지 검사 합니다.

  ex) a = b + c  같은경우는 5개

  그다음에 그 줄에서 ‘+’문자가 몇 개 있는지 수를 셉니다.

  두 개의 정보를 합쳐서 토큰이 5개이고 ‘+’문자가 1개이면

  더하기 연산을 하는 것으로 간주합니다.


4,print 함수

  ‘print('까지의 문자가 일치했을 경우 에 print함수가 실행되었다고 인식하며

  ‘(’문자부터 ‘)’ 문자 사이에서 스캔을 하게 됩니다.

  우선 첫글자에 쌍따옴표가 있는지를 검사하여 쌍따옴표가 있을 경우, 직접 스트링을 입력    한 것으로 간주하여 다음 쌍 따옴표가 나올때까지 한글자씩 화면에 출력합니다.

  (이때 ‘\n'문자가 있을 경우 줄바꿈을 합니다.)


  첫글자에 쌍따옴표가 아닐 경우 변수로 간주하여 변수의 Type를 검사합니다.


  변수가 int일 경우 WriteInt(책 라이브러리 함수) 함수로 화면에 출력합니다.


  변수가 string일 경우 WriteString(책 라이브러리 함수) 함수를 화면에 출력합니다.

  (WriteString 실행 바로전에 ‘\n'은 0dh,0ah 로 변환 합니다.)


5, input 함수

  input함수 내부에서 책 라이브러리중  ReadString함수를 사용하는데 최대 128개의 문자밖에 지원되지 않아서  최대 입력받을수 있는 문자수는 128로 고정 합니다.

  

6,기타

 문법 오류검사 없음

 변수명 오류검사 없음

 대소문자 구분함(디렉티브를 제외한 모든 함수명과 키워드는 소문자)

 변수의 개수 255한정

 BEGIN디렉티브 이전의 값과 END디렉티브 이후에 값은 무시 하게끔 동작 합니다.

 int 형에 65535이상의 숫자를 지정할 수 없음

곱셈의 경우 결과 값이 2바이트를 넘지 못함

나눗셈의 경우 피제수는 2바이트 제수는 1바이트를 넘지 못합니다.


7,실행법

실행파일이 report.exe이고 소스 파일이 test.is일 경우 아래의 명령어로 실행이 가능합니다.

   >report.exe test.is


#소스코드 & 실행파일 & 스크립트파일 다운받기
Simple_Interpreter(source__exe__script).zip


덧글

댓글 입력 영역