Lab & Homeworks‎ > ‎

Lab & Homeworks 2017

1. [HW1] 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://ecampus.kookmin.ac.kr)에 온라인으로 제출하고 마감일 강의 시작 전에 출력물 제출

2. [LAB] 확장된 명령어 사용

  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
    • I/O를 제외하고는 모두 Relative Addressing(OORMD)을 사용하시오
    • 상수  변수는 2개의 BOX 표현해야 한다. (낮은 자리가 낮은 주소로.. )
          90:  DBOX  12345678  ==> 90: 5678,  91:1234
  • 생각해보기
- Skip on Condition & JMP의조합을 어떤 Conditional Jump 바꿀 것인가?
- SKIP3 를 사용할 경우 후속 명령어가 3 BOX 미만인 경우 어떻게 처리하였는가?

   <<제출 방법>>
  • 제출하지 않고 자율 실습 (But 시험문제와 관련 있음)

3. [LAB] 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에 어떻게 로딩하여 실행했는지 설명
<<제출 방법>>
  • 제출하지 않고 자율 실습 (But 시험문제와 관련 있음)
4. [LAB] IO in Text Mode
1. 텍스트 모드의 터미널에서 입출력
  • mainboard/CMOS의 내용
# IO.Addr  Type            R/W     Opt.
10             KEYBOARD              mode=D
12             SCREEN                  mode=D        // Decimal mode or Debug mode
30             TAPE                       deck=cassette cassette=BOOT     // BOOT의 내용은 9710 0700
    • CMOS가 위와 같을 때 다음과 같이 실행해보시오. 출력 결과는?
    Monitor> edit 100 1305 0063 0000 0612 9710 0700
    Monitor> dasm 100 6
    Monitor> run 100
    • CMOS를 아래와 같이 변경해서 다시 부팅(./lmc 재실행)하고 다시 실행해보시오.
    # IO.Addr  Type            R/W     Opt.
    10             KEYBOARD              mode=T
    12             SCREEN                  mode=T        // Text mode - 현실의 모든 터미널은 텍스트 모드 임 (Ex. Putty)
    30             TAPE                       deck=cassette cassette=BOOT     // BOOT의 내용은 9710 0700
    • 참고: '?' 문자의 ASCII 코드 값은 십진수로 63이다. 교재 p409,.p410
    2. 아래 프로그램을 번역하여 텍스트 모드에서 실행해보시오
    SAMPLE START 0
    KEYBOARD EQU 10
    SCREEN EQU 12
    QUESTION BOX '?' // ASCII Code 63
    FIRST MOVH A, QUESTION
    OUT SCREEN
    JSUB READ_BOX
    MOV DATA1, A
    MOVH A, QUESTION
    OUT SCREEN
    JSUB READ_BOX
    MOV DATA2, A
    SUB A, DATA1
    SKN3
    JUMP LAST
    MOV A, DATA1
    SUB A, DATA2
    LAST JSUB OUT_BOX
    INT 10
    COB
    DATA1 RESDBOX 1
    DATA2 RESDBOX 1
    NUM RESDBOX 1
    RESDBOX 1
    READ_BOX MOV C, #4
    MOV A, #0
    MOV NUM, A
    RLOOP IN KEYBOARD
    CMP A, #'0' // ASCII Code 48
    JN READ_RETURN
    CMP A, #'9' // ASCII Code 57
    JP READ_RETURN
    SUB A, #'0'
    MOV D, A
    MOV A, NUM
    MUL #10
    ADD A, D
    MOV NUM, A
    JLOOP RLOOP
    READ_RETURN MOV A, NUM
    RSUB READ_BOX
    RESDBOX 1
    OUT_BOX MOV D, A
    DIV #1000
    ADD A, #'0'
    OUT SCREEN
    MOV A, D
    DIV #100
    DIV #10
    MOV A, X
    ADD A, #'0'
    OUT SCREEN
    MOV A, D
    DIV #10
    DIV #10
    MOV A, X
    ADD A, #'0'
    OUT SCREEN
    MOV A, D
    DIV #10
    MOV A, X
    ADD A, #'0'
    OUT SCREEN
    RSUB OUT_BOX
    END FIRST
    • 필요하면 어셈블러를 사용하시오. (pp330,331)
    3. 이 프로그램을 BIOS를 사용하여 다시 작성하시오. (이 때 터미널은 텍스트 모드가 아니어도 됨)
    • 교재 p272 부터 참고
    • 위 함수 READ_BOX, OUT_BOX를 아래 BIOS로 대치 가능
    정수 입력 
       LD  A  #10     // Keyboard 장치
       INT 1             // A에 정수가 입력되어 있음
       // 1305 0010 0000 9701

    정수 출력
       LD  X  A     // 출력할 정수 값이 A에 있었다면... (다른 레지스터나 메모리에 있어도 됨)
       LD  A  #12     // SCREEN 장치로 출력
       INT 11           
      // 1240 1305 0012 0000 9711

    5. [HW2] Hand compile - insertion sort
    1. insertion sorting 프로그램을 hand-compile하여 실행하시오.
    • sorting 할 숫자는 배열에 들어있음 (DBOX type)
    • 이 배열의 초기 값은 상수이어도 되고 프로그램 초기에 입력받아도 됨
    • 프로그램 끝 부분에서 sorting된 결과를 출력하야 함
    • 컴파일된 LMC 기계어 코드를 "insertionsort.lmc"라는 이름의 tape에 담은 후 교재 p359에 나오는 LOAD 명령어로 로딩해도 됨
      LOAD DEV <io addr>  <target-address>
    • 이 때 CMOS 의 내용을 아래와 같이 하고 BOOT에는 Monitor 진입하는 코드(9710)만 남겨놓는다.
    #IO.Addr Type     R/W   Opt...
    10       KEYBOARD       mode=D
    12       SCREEN         mode=D
    30       TAPE     RW    cassette=BOOT
    40       TAPE     RW    cassette=insertionsort.lmc
     for i = 1 to length(A) - 1
        x = A[i]
        j = i
        while j > 0 and A[j-1] > x
            A[j] = A[j-1]
            j = j - 1
        end while
        A[j] = x
     end for
    
     출처: https://en.wikipedia.org/wiki/Insertion_sort
    • A[j] 는 *(A+j*2) 와 같음
        즉 
      A는 배열 A의 시작 주소, 정수는 2 BOX이므로 곱하기 2, A+j*2는 주소이므로 indirect addressing(*)
    • j*2 j+j 로 하는 것이 간편하고 빠름
    <<제출 방법>>
    • 사이버캠퍼스(http://ecampus.kookmin.ac.kr)에 온라인으로 제출하고 마감일 강의 시작 전에 출력물 제출

    6. [HW3] Subroutine Program
    1. 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. JCALL/JRET, JSUB/RSUB, CALL/RET 명령어에서 Return address를 저장했던 방식 참고
        2. Report 내용
    • 재구성된 Sum(1..n) 프로그램 (니모닉과 주석으로 표현)
    •  Sum(1..n)프로그램을 의사 C로 표현
    • 생각해보기
             - 위 C 프로그램 LMC 코드 바꿀 때 상수변수파라미터반환값 등을 어떻게 표현 또는 처리 하였는가?
        3. 제출방법
    • 사이버캠퍼스(http://ecampus.kookmin.ac.kr)에 온라인으로 제출하고 마감일 강의 시작 전에 출력물 제출
    Comments