Mano의 컴퓨터시스템구조

[mano의 컴퓨터시스템 구조] 6장 기본 컴퓨터 프로그래밍

studyingalone 2024. 12. 16. 17:47
728x90

mano의 컴퓨터시스템 구조: 6장 기본 컴퓨터 프로그래밍

6.1 개요 

Computer Instructions

  • 대부분 컴퓨터는 포트란 자신이 실행할 수 있는 이진 코드로 번역하는 번역 프로그램(translator program)을 갖고 있다.
  • 번역 프로그램은 특정 컴퓨터 하드웨어에 인지되야 하므로 기계 종속적 프로그램이어야 한다.
  • 위 표는 사용자의 기호 프로그램을 이진 프로그램으로 번역하는 명령어이다.
  • AND, ADD, LDA, STA, BUN, BSA, ISZ은 메모리 참조 명령어 이다.
  • CLA, CLE, CMA, CME, CIR, CIL, INC, SPA, SNA, SZA, SZE, HLT는 레지스터 참조 명령어이다.
  • INP, OUT, SKI, SKO, ION, IOF는 입출력 명령어이다.

6.2 기계어

  1. 이진코드: 메모리상 실제로 나타나는 형태의 멸령어
  2. 8, 16진수: 이진수 코드를 8, 16 진수로 나타낸 것
  3. 기호 코드: 사용자가 연산, 주소 부분 등에 대하여 기호(문자, 숫자, 특수문자 등)를 사용하며, 각 기호 명령어는 하나의 이진 코드로 번역되는데 이 번역은 어셈블리(assembler)라는 특수한 프로그램이 한다. 이러한 종류의 기호 프로그램을 어셈블리 언어(assembly language)라고 부른다.
  4. 고급 프로그래밍 언어: 컴퓨터 하드웨어의 동작을 위주로 하지 않고 문제해결에 필요한 과정으 고려히야 개발된 언어이다. 문제 위주의 기호와 형식을 사용하며, 각 문장은 실행 전 여러 개의 이진 명령어로 번역되는데, 이 번역 프로그램을 컴파일어(compiler)라고 부른다.

6.3 어셈블리 언어

언어 규칙

 

어셈블리 언어는 필드(field)라 불리는 세 개의 부분으로 구성된다.

  1. 라벨 필드(label field): 기호 주소를 나타내거나 빈칸
  2. 명령어 필드(instruction field): 기계 명령어나 슈도 명령어
  3. 코멘트 필드(comment field): 명렁어에 대한 주석이나 해설

명령어 필드(instruction field)

  1. 메모리 참조 명령어(MRI)
  2. 레지스터 참조 or 입출력 명령어
  3. 슈도 명령어(pseudo code)

슈도 명령어의 정의

Symbol Information for the Assembler 
ORG  N 16진수 N은 다음 줄에 나열된 명령어 또는 피연산자의 메모리 위치
END 기호 프로그램의 끝
DEC  N   부호가 있는 십진수 N을 이진수로 변환
HEX  N 16진수 N을 이진수로 변환

6.4 어셈블러

  • 어셈블러(assembler): 기호-언어 프로그램을 읽어서 해당되는 이진 프로그램으로 번역하는 일종의 프로그램
  • 소스 프로그램(source program): 입력되는 기호 프로그램
  • 목적 프로그램(object program): 결과로 나오는 이진 프로그램

메모리 내 기호 프로그램 표현

  1. 입력 처리:
    • 사용자가 터미널에 입력한 기호 프로그램은 로더(loader) 프로그램을 통해 메모리에 저장
    • 각 문자는 ASCII 코드(8비트)로 표현되며, 한 메모리 워드(16비트)에는 두 문자가 저장
  2. 코드 구문 분석:
    • 레이블은 쉼표로 종료, 명령어 및 주소는 공백으로 구분되며, 줄 끝은 캐리지 리턴(CR) 코드로 표시됩니다.
    • 주석은 슬래시(/)로 시작하며, 어셈블러는 주석을 무시하고 CR 코드에서 줄 처리를 종료합니다.

어셈블리 프로세스

  1. First Pass
    • 목적: 주소 심볼 테이블(Address Symbol Table) 생성.
    • 주요 작업:
      • 레이블 탐지: 레이블과 해당 메모리 주소를 테이블에 저장.
      • LC(Location Counter): 명령어나 데이터의 메모리 주소를 저장하며, 각 줄 처리 후 1씩 증가.
      • ORG 및 END 처리: ORG는 LC를 초기화하며, END는 첫 번째 패스를 종료.
  2. Second Pass
    • 목적: 기호 프로그램을 이진 기계어로 변환.
    • 주요 작업:
      • 각 줄의 기호를 테이블에서 검색해 이진값을 매칭.
      • 명령어 테이블 참조:
        • 기계어 참조(MRI), 비기계어 참조(Non-MRI), 의사 명령어 테이블(Pseudoinstruction Table)을 활용.
      • 심볼의 이진 번역 및 메모리 저장.

에러 진단

  • 유효하지 않은 기계어: MRI 또는 Non-MRI 테이블에 없는 기호.
  • 정의되지 않은 심볼: 주소 테이블에 없는 기호 사용.
  • 에러 발생 시 메시지를 출력해 프로그래머에게 알려줌.

6.6 산물 및 논리 연산의 프로그래밍

  • 컴퓨터는 다양한 명령어 집합을 가짐.
    • 일부 컴퓨터는 하드웨어로 ADD, SUB, MUL, DIV 등을 지원.
    • 다른 컴퓨터는 일부 연산(예: MUL, DIV)을 소프트웨어로 구현.
  • 하드웨어 구현: 추가 회로가 필요해 비용이 높지만 속도가 빠름.
  • 소프트웨어 구현: 프로그램으로 연산을 처리하며, 실행 시간이 길고 명령어가 많음.

곱셈 프로그램

 

  • 가정: 두 양수, 각 숫자는 8비트 이내, 결과는 16비트 이내.
  • 절차:
    1. 곱셈은 종이와 펜으로 처리하는 방식과 유사:
      • 곱셈기 Y의 각 비트를 확인.
      • 비트가 1이면, 피승수 X를 부분 곱(P)에 추가.
      • X는 매번 왼쪽으로 이동(Shift) 연산.
    2. 루프:
      • CTR = -8로 초기화, P는 0으로 설정.
      • Y의 최하위 비트를 확인하여 X를 P에 추가.
      • X를 왼쪽으로 이동하고, CTR이 0이 될 때까지 반복.
    3. 결과: P에 최종 곱셈 값 저장.

 

배정밀도 덧셈 (Double-Precision Addition)

  • 목적: 16비트 연산의 결과(최대 32비트)를 정확히 처리.
  • 방법:
    • 하위 16비트 (AL, BL)와 상위 16비트 (AR, BH)를 별도로 처리.
    • 하위 비트에서 발생한 캐리를 상위 비트 연산에 반영.
    • 최종 결과는 CL, CH에 저장.

논리 연산 (Logic Operations)

  • 기본 논리 명령어: AND, CMA(Complement), CLA(Clear AC).
  • 모든 논리 연산은 AND와 CMA를 조합해 구현 가능.

시프트 연산 (Shift Operations)

  • 논리적 시프트 (Logical Shift):
    • 오른쪽: CLE → CIR (E를 0으로 설정 후 AC와 E를 오른쪽 순환).
    • 왼쪽: CLE → CIL (E를 0으로 설정 후 AC와 E를 왼쪽 순환).
  • 산술 시프트 (Arithmetic Shift):
    • 오른쪽: 부호 비트를 유지하며, E를 부호 비트로 설정 후 순환.
    • 왼쪽: 부호 비트를 유지하며 순환. 부호 비트와 E를 비교해 오버플로 확인.

6.7 서브루틴 (Subroutine)

 

  • 서브루틴(Subroutine): 프로그램 내에서 반복적으로 사용되는 공통 코드를 모듈화하여 한 번만 작성한 뒤, 필요한 곳에서 호출할 수 있도록 하는 구조
  • 서브루틴 호출 시 메인 프로그램은 해당 위치로 분기하며, 수행 후 원래의 실행 위치로 복귀

서브루틴 데이터 전달

  • 레지스터를 통해 데이터를 전달
  • 메모리에 데이터를 저장하여 서브루틴이 접근할 수 있도록 한다

장점

  • 코드 재사용을 통해 작성 및 디버깅 시간을 줄이고, 유지보수를 용이하게 한다.
  • 프로그램이 더 간결하고 모듈화되어 가독성이 향상된다.

6.8 입출력 프로그래밍

입력 및 출력 프로그래밍

  • 입력 (Input):
    • INP 명령어로 이진 코드를 AC(Accumulator)에 저장.
    • 입력 플래그 (SKI)를 확인해 입력 가능 여부 체크. 플래그가 1이 아니면 반복해서 확인.
  • 출력 (Output):
    • AC에 저장된 이진 코드를 OUT 명령어로 출력.
    • 출력 플래그 (SKO)가 1이 될 때까지 대기.

문자 조작

  • 컴퓨터는 계산기뿐만 아니라 심볼 조작기 역할도 수행.
  • 문자 패킹(packing):
    • 두 문자를 하나의 16비트 워드로 패킹하여 저장 (문자당 8비트).
    • IN2 서브루틴 사용: 두 번 입력받고, SH4 서브루틴으로 8비트씩 이동.
  • 버퍼(buffer)에 저장:
    • 키보드 입력을 버퍼 메모리에 연속적으로 저장.
    • 포인터를 이용해 버퍼 위치 관리.

프로그램 인터럽트

  • 필요성:
    • 입력/출력 장치의 플래그를 반복적으로 확인하는 대기 시간을 제거.
    • 다른 프로그램 실행 중에도 데이터 전송 가능.
  • 작동 원리:
    • 실행 중인 프로그램이 ION 명령어로 인터럽트를 활성화.
    • 플래그가 1이 되면 현재 명령 실행을 마친 뒤 인터럽트 발생.
    • 인터럽트 사이클: 현재 프로그램의 반환 주소를 저장하고 서비스 루틴으로 분기.
  • 서비스 루틴 작업:
    1. 프로세서 레지스터 내용 저장.
    2. 플래그 확인 및 서비스 장치 결정.
    3. 플래그가 활성화된 장치 서비스.
    4. 레지스터 복원.
    5. 인터럽트 재활성화.
    6. 실행 중인 프로그램으로 복귀.

 

 

728x90
반응형