Lab & Homeworks‎ > ‎

Homeworks 2014

1. Sum(1..n) 프로그램 및 기본 명령어 완성
  1. n 값을 입력 받아 1 부터 n 까지의 합을 구해 출력하는 프로그램을 LMC 10개의 명령어를 이용하여 작성하고 실행하시오.
  2. lmc.c의 LittleMan() 의 기본 명령어 중 빠진 명령어 2,4,9 를 구현해 넣고 컴파일한 후 Sum 프로그램을 다시 실행시키시오.
    • 참고할 페이지: 모듈 --> CPU --> LittleMan    Click here!
    • 컴파일하는 방법: make
<< 리포트 내용 >>
  1. LMC 기계어로 작성된 프로그램에 니모닉 및 주석을 단 프로그램 (예:  299   STA 99  // A 값을 99번지에 저장, 99번지는 int n;를 뜻함)
  2. 해당 프로그램을 LMC 머신에서 실행시키는 과정을 설명 (프로그램을 메일박스로 옮기는(Loading) 과정. 예: Tape booting ...)
  3. 생각해보기(리포트에 포함)
  • 상수 1과 변수 n을 메일 박스의 어디에 배치할 것인가?
<<제출 방법>>
  • 사이버캠퍼스(http://cyber2010.kookmin.ac.kr/index.jsp)에 온라인으로 제출하고 마감일 강의 시작 전에 출력물 제출
2. JCall/JRet, JSub/RSub, Call/Ret 명령어 확장
  1. 교재 2.1(p35)의 Call, Return 명령 세종류를 구현하시오.
  2. 새로 구현된 6개 명령어를 테스트할 수 있는 프로그램을 작성하고 이를 실행하면서 디버거의 Break, Watch 등의 가능을 활용하여 새 명령어가 잘 동작함을 확인하시오.
  • 테스트프로그램은 각 명령어가 잘 동작하는 경우와 사용할 수 없는 한계의 경우를 모두 만들어야 함
  • 테스트프로그램을 먼저 만들어 목적대로 동작하는지를 확인하고 6개 명령어를 만드는 것이 좋음
    이 경우 6개 명령어 코드는 빌틴에서 정해진대로 따르는 것이 좋음(builtin/cpubuiltin.h에 정의 되어 있고 원하면 바꿀 수 있음)
    JCall(OORMFA) : 86, JRet(OOOO) : 9997, JSub(OORMFA) : 81, RSub(OORMFA) : 84
    Call(OORMFA) : 76, Rey(OOOO) : 9998
  • 참고: Monitor, Debugger 기능 - 9.1, 9.3 따라해보기
  • 참고: JCall/JRet 구현을 위해 사용되는 R 레지스터는 lmc.c 소스코드에서는 RETURN 으로 정의 됨
  • 참고: 명령어 확장 방법 - Appendix D, F_OORMFA(3 box 형식)만 구현함
  • 참고: 2 box 길이의 주소는 낮은 자리 4자리 값이 낮은 자리의 주소에 저장됨
    예를 들어 교재의 CALL 65는 OORMFA 포맷에서는 CALL 0065 0000 으로 써야 함
<< 리포트 내용 >>
  1. 6개 명령어의 설명 및 구현 코드 조각
  2. 테스트 프로그램 설명 및 디버거의 Break, Watch 계획
  3. 실행 예
  4. 생각해보기(리포트에 포함)
  • 각 명령어의 한계 상황을 디버거로 추적하면서 설명 할 것
<<제출 방법>>
  • 사이버캠퍼스(http://cyber2010.kookmin.ac.kr/index.jsp)에 온라인으로 제출하고 마감일 강의 시작 전에 출력물 제출
3. Addressing Mode - LD 명령어 구현
  1. LD 명령어를 모든 Addressing Mode에서 동작하도록 확장하시오.
  2. 모든 경우를 테스트할 수 있는 간단한 테스트 LMC 프로그램을 작성하여 실행시키시오.
  • 참고: 강의 노트: Addressing Mode
  • 참고: 교재 7장 pp221-231 특히 p230의 getTargetAddress()
  • 처음에 LMC 모니터를 실행시키려면 cassette/BOOT의 내용이 "9710 0700"이어야 한다.
<< 리포트 내용 >>
  1. 구현 내용 설명
  2. 테스트 계획 및 테스트 프로그램 설명 및 실행 예
  3. 생각해 보기 - 테스트 프로그램.들을 LMC에 어떻게 로딩하여 실행했는지 설명
<<제출 방법>>
  • 사이버캠퍼스(http://cyber2010.kookmin.ac.kr/index.jsp)에 온라인으로 제출하고 마감일 강의 시작 전에 출력물 제출
4. Subroutine Program
  1. 다음 프로그램을   OoAa Type 명령어를 사용하지 말고 확장된 명령어들(OoRR, OoRMFA, OORMD)로 다시 작성하여 실행 하시오. 
    •  IN   10  // 510
       STA  11  // 211
       IN   10  // 510
       STA  12  // 212
       SUBA 11  // 411
       SKN      // 803
       JMP  09  // 909
       LDA  11  // 111
       SUBA 12  // 412
       OUT  12  // 612
       COB      // 700
       BOX  0   // 000
       BOX  0   // 000
      
       
    • Memory Mapped IO를 사용하시오.
      예    LD  A  92000100       ==>   1300  0100  9200
    • 상수  변수는 2개의 BOX 표현해야 한다. (낮은 자리가 낮은 주소로.. )
          90:  DBOX  12345678  ==> 90: 5678,  91:1234

  2. Sum(1..n) 프로그램을 3개의 함수로 나누고 main에서는   3 함수를 호출하는 구조로 바꾸시오 
 main() {
    n = data_in();
    total = sum(n);
    print(total);
 }
 
    1. Memory Mapped IO를 사용하시오.
      예    LD  A  92000100       ==>   1300  0100  9200
    2. 상수  변수는 2개의 BOX 표현해야 한다. (낮은 자리가 낮은 주소로.. )
          90:  DBOX  12345678  ==> 90: 5678,  91:1234

    3. Report 내용
  • 바뀐 2 프로그램(니모닉기계어주석 포함)
     LD  A  20    1100 0020 0000   // 20:21번지 값을 A 이동
  • 위 3번에서 재구성된 Sum(1..n) 프로그램 (니모닉과 주석으로 표현)
  •  Sum(1..n)프로그램을 의사 C 표현
  • 생각해보기
           - Skip on Condition & JMP의조합을 어떤 Conditional Jump 바꿀 것인가?
           - 3번의 C 프로그램 LMC 코드 바꿀 때 상수변수파라미터반환값 등을 어떻게 표현 또는 처리 하였는가?

    4. 제출방법
  • 사이버캠퍼스(http://cyber2010.kookmin.ac.kr/index.jsp)에 온라인으로 제출하고 마감일 강의 시작 전에 출력물 제출

5. Loader 및 실행화일
    [ 공지사항을 참고하여 lmc 머신 코드를 업그레이드 하세요. ]
1. lmc를 부팅하면 Monitor로 진입하도록 바꾸고 다음을 실행하시오.
    • cassette/BOOT의 내용을 "9710 0700" 으로 다시 바꾸고 ./lmc를 실행
    • 13 (LD,OORFMA) , 22 (ST,OORFMA)
Monitor> edit 100 1300 0200 0000 2200 0120 9200 1300 0202 0000 2200 0120 9200 9710 0700
Monitor> edit 200 0062 0063 0010 0000
Monitor> run 100

2. 다음을 실행해 보시오.
Monitor> dasm 100 14
. . . 
Monitor> dump 200 4
. . . 


3. 이 프로그램을 "cassette/test.bl"이라는 BL type의 실행 화일로 만들어서 다음 명령으로 로딩하고 실행하시오.
    [ 공지사항을 참고하여 lmc 머신 코드를 업그레이드 하세요. ]
  • 교재 Ch 5 & Ch 7.6 p234,235
  • mainboard/CMOS의 내용
# IO.Addr  Type            R/W     Opt.
10             KEYBOARD              default-mode=D
12             SCREEN                  default-mode=D
30             TAPE                       deck=cassette cassette=BOOT
40             TAPE                       deck=cassette cassette=test.bl
  • load and run
Monitor> load bl 40     // IO 40번지 장치에서 BL type의 실행화일을 로드하라는 뜻
Monitor> run 100
. . . 

  • cassette/test.bl의 실제 내용
0072 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0100 0000 0104 0000
1300 0200 0000 2200 0120 9200 1300 0202 0000 2200 0120 9200 9710 0700
0000 0000 0000 0000 ..... // 0000 이 86개
0062 0063 0010 0000
0069 0100 0000

 

  • cassette/test.bl의 내용 - 사람이 보기 좋은 형태
H "0123456789" 0100 0000 0104 0000
1300 0200 0000 2200 0120 9200 1300 0202 0000 2200 0120 9200 9710 0700
0000 0000 0000 0000 ..... // 0000 이 86개
0062 0063 0010 0000
E 0100 0000

 

 

4. 이 프로그램을 "cassette/test.rl"이라는 RL type의 실행 화일로 만들어서 다음 명령으로 로딩하고 실행하시오.
    [ 공지사항을 참고하여 lmc 머신 코드를 업그레이드 하세요. ]
  • 교재 Ch 5 p123
  • H, T, E 레코드만 사용하고 M 레코드는 여기서는 사용하지 않는다.
  • mainboard/CMOS의 내용
# IO.Addr  Type            R/W     Opt.
10             KEYBOARD              default-mode=D
12             SCREEN                  default-mode=D
30             TAPE                       deck=cassette cassette=BOOT
40             TAPE                       deck=cassette cassette=test.rl
  • load and run (M 레코드가 없으므로 반드시 실행화일의 start 주소와 같은 곳에 loading해야 한다.)
Monitor> load rl 40 100   // IO 40번지 장치에서 RL type의 실행화일을 읽어 100번지부터 로드하라는 뜻
Monitor> run 100
. . . 
  • cassette/test.rl의 내용 - 사람이 보기 좋은 형태
H "0123456789" 0100 0000 0104 0000
T 0100 0000 0009 1300 0200 0000 2200 0120 9200 1300 0202 0000 T 0109 0000 0005 2200 0120 9200 9710 0700
T 0200 0000 0004 0062 0063 0010 0000
E 0100 0000

 

5. 위 4번 실행화일에 M 레코드를 추가하여 어느 곳에 로딩하여도 문제없이 실행되도록 하시오.
  • load and run 
Monitor> load rl 40 398   // IO 40번지 장치에서 RL type의 실행화일을 읽어 398번지부터 로드하라는 뜻
Monitor> run 398
. . . 
  • cassette/test.rl의 내용 - 사람이 보기 좋은 형태
H "0123456789" 0100 0000 0104 0000
T 0100 0000 0009 1300 0200 0000 2200 0120 9200 1300 0202 0000 T 0110 0000 0005 2200 0120 9200 9710 0700
T 0200 0000 0004 0062 0063 0010 0000
M 0101 0000 0002 // 0000:0101 번지부터 2박스를 바꾸라는 뜻
. . .
E 0100 0000
  • 상수를 코드 앞에 놓는다면 아래와 같을 것이다 - 주의 E record
H "0123456789" 0100 0000 0018 0000
T 0100 0000 0004 0062 0063 0010 0000
T 0104 0000 0009 1300 0100 0000 2200 0120 9200 1300 0102 0000 T 0113 0000 0005 2200 0120 9200 9710 0700
M 0105 0000 0002 // 0000:0105 번지부터 2박스를 바꾸라는 뜻
. . .
E 0104 0000
 
6.1번 프로그램을 아래와 같이 CMOS에서 SCREEN의 mode를 T(text)로 변경하여 실행하고 그 차이를 관찰하시오.
    [ 공지사항을 참고하여 lmc 머신 코드를 업그레이드 하세요. ]
    [ 만약 default-mode=D 일때와 동일한 결과를 얻었다면, 버그 패치 공지사항을 참고하여 개선하세요. ]
    • mainboard/CMOS의 내용
    # IO.Addr  Type            R/W     Opt.
    10             KEYBOARD              default-mode=D
    12             SCREEN                  default-mode=T
    30             TAPE                       deck=cassette cassette=BOOT
    40             TAPE                       deck=cassette cassette=test.bl
    • load and run
    Monitor> cat 40
    Monitor> load bl 40     // IO 40번지 장치에서 BL type의 실행화일을 로드하라는 뜻
    Monitor> run 100
    . . . 

    7. 40번지 장치의 카세트를 CC(Change Cassette) 명령어를 통해 test.rl로 교체한 후 실행하고 그 차이를 관찰하시오.
        [ 공지사항을 참고하여 lmc 머신 코드를 업그레이드 하세요. ]
        [ 만약 default-mode=D 일때와 동일한 결과를 얻었다면, 버그 패치 공지사항을 참고하여 개선하세요. ]
    • mainboard/CMOS의 내용
    # IO.Addr  Type            R/W     Opt.
    10             KEYBOARD              default-mode=D
    12             SCREEN                  default-mode=T
    30             TAPE                       deck=cassette cassette=BOOT
    40             TAPE                       deck=cassette cassette=test.bl
    • load and run
    Monitor> cc 40 test.rl
    Monitor> dump dev
    Monitor> cat 40
    Monitor> load rl 40 100   // IO 40번지 장치에서 RL type의 실행화일을 읽어 100번지부터 로드하라는 뜻
    Monitor> run 100
    . . . 

      8. 리포트 내용
      • 마지막 5번 프로그램의 LMC 프로그램(ORG를 적절히 사용하고 주소는 숫자대신 symbolic label로 표현할 것)
      • 6번,7번에서 관찰한 SCREEN의 두가지 모드 D,T에 대해 설명하시오. 
        힌트: 교재 p235
      9. 제출 방법
      • 사이버캠퍼스(http://cyber2010.kookmin.ac.kr/index.jsp)에 온라인으로 제출하고 마감일 강의 시작 전에 출력물 제출

      6. 시스템 부팅
      1. 교재를 참고하여 부팅하면 간단한 Starter 프로그램이 실행되는 부팅 카세트를 제작하시오.
        • pp381~383, pp386~387
        • 부트스트랩 로더를 만들어야 함( BL type을 읽을 수 있는 Absolute Loader)
        • 필요하면 어셈블러를 사용하시오. (pp330,331)
      2. 다음 화일을 작성하여 
        • ./bin/byte2box 명령어로 변환한 뒤 두 화일의 차이를 관찰하고 비교하시오.
        • 내장 어셈블러는 이미 바이트 모드를 동작하고 있습니다. 내장 어셈블러 사용시 byte2box 명령을 사용하지 않아도 됩니다.
          • 입력파일과 어셈블리리스트 파일은 바이트 형식으로 생성되고, 실행파일은 box 형식으로 생성됩니다.
        • // "cassette/starter.txt"로 저장 
          STARTER      START  2000
           _SCREEN      EQU     12        // Screen Device
          MOV D, ="Hello, Starter"
          MOV A, #14
          ST.CW *D, #_SCREEN
          INT 10 // Trap to Monitor
          COB // Halt
          END
        • // 리눅스 쉘에서 ...
          $./bin/byte2box cassette/starter.txt  cassette/starter.lmc
          $cd cassette
        • $cat starter.txt
        • ....
        • $cat starter.lmc
        • ....
        • // LMC Monitor에서...
        • // CMOS에서 SCREEN의 mode는 T로 설정되고 40번지에 TAPE 장치를 장착했다고 가정 ...
        • Monitor>CC 40 starter.txt
        • Monitor>CAT 40
        • ....
        • Monitor>CC 40 starter.lmc
        • Monitor>CAT 40
      3. 리포트 내용
        • 부트스트랩 로더와 이를 통해 부팅되는 과정을 설명
        • 실행 화면 삽입
        • byte로된 화일과 BOX로된 화일의 차이 설명

      4. 제출 방법
        • 사이버캠퍼스(http://cyber2010.kookmin.ac.kr/index.jsp)에 온라인으로 제출하고 마감일 강의 시작 전에 출력물 제출
      7. Array and Pointer

      1. 다음 프로그램을  LMC 코드로 번역하여 실행하시오.
      • static int table[10] = {10,9,8,7,6,5,4,3,2,1};    // 이렇게 초기화가 된다고 가정!!

        static int a, b, result; static int *p;
        static int add_two(int x, int y) {

            int tmp;     tmp = x + y;     return tmp;        // 반환값을 A 레지스터가 아닌 스택을 통해서 전달 받는다.  // 함수 호출된 후 C,D,X 레지스터는 보존(PUSH)되었다가 복원(POP)되어야 함     }
        main() {
            result = add_two(2,3);     OUT(result,stdout);
            a = table[2];     b = table[3];     result = add_two(a,b);     OUT(result,stdout);
            result = add_two(table[4],table[5]);     OUT(result,stdout);
            p = table;     result = add_two(p[1], *(p+2));     OUT(result,stdout);
            p = &table[5];     result = add_two(p[1], *(p+2));     OUT(result,stdout);
        }

      2. 위 프로그램의 Global Array를 아래와 같이 Local Array로 바꾸고 이를  LMC 코드로 번역하여 실행하시오.
      • static int add_two(int x, int y) { int tmp; tmp = x + y; return tmp; // 반환값을 A 레지스터가 아닌 스택을 통해서 전달 받는다. } main() { int table[10]; int a, b, result; int *p; int i; for(i=9; i--; i>=0) table[i] = i+1; result = add_two(2,3); OUT(result,stdout); a = table[2]; b = table[3]; result = add_two(a,b); OUT(result,stdout); result = add_two(table[4],table[5]); OUT(result,stdout); p = table; result = add_two(p[1], *(p+2)); OUT(result,stdout); p = &table[5]; result = add_two(p[1], *(p+2)); OUT(result,stdout); }


      3리포트 내용
      • 각 변수들의 배치 상황 설명
        - add_two 함수의 activation record 그림
        - 전역 변수들의 배치 상황 그림
        - Local Array의 배치 상황과 각 element의 addressing 방법
      • 위 프로그램 
        - 모니터의 어셈블러를 이용해서 나온 어셈블리 리스트(기계어주소라인넘버니모닉이  포함제출
      • 실행 예시
        - add_two가 호출될 때 마다 activation record가 형성되었다가 해체되는 과정 그림으로 설명
      3. 제출 방법
      • 사이버캠퍼스(http://cyber2010.kookmin.ac.kr/index.jsp)에 온라인으로 제출하고 마감일 강의 시작 전에 출력물 제출

      Comments