Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

ultra_dev

명령어 본문

혼자 공부하는 컴퓨터구조+운영체제

명령어

ultra_dev 2023. 8. 28. 21:50

자바같은 고급언어를 저급언어로 변환하여 컴퓨터가 실행!

 

 

 

 

 

 

고급언어

  • 개발자가 이해하기 쉽게 만든 언어

저급 언어

  • 컴퓨터가 이해하고 실행하는 언어
  • 기계어와 어셈블리어로 나뉨
  • 기계어
    • 이진수 (0과 1로)나 십육진수(0~9,A~F)로 표현됨
  • 어셈블리어
    • 기계어를 읽기 편한 형태로 번역한 저급 언어
    • 소스코드에 직접 입력해서 개발도 가능

 

 

 

 

고급언어가 저급 언어로 바뀌는 것에는 2가지 방법이 존재

  • 컴파일 언어 → 컴파일 → 저급 언어
    • 컴파일 언어로 작성된 소스 코드가 컴파일러에 의해 저급 언어로 변환되고(컴파일), 그 결과 저급 언어인 목적코드가 생성 된다.
    • 오류 같은 건 없는지 확인 후 통째로 컴파일
    • 소스 코드 컴파일 중 오류가 발생하면 소스 코드 전체가 실행되지 않음
  • 인터프리터 언어 → 인터프리트 → 저급 언어
    • 인터프리터에 의해 한 줄씩 실행
    • 소스 코드 전체가 저급 언어로 변환되기까지 기다릴 필요 없음
    • 소스 코드 인터프리터 중 오류가 발생하면 오류 발생 전까지의 코드는 실행됨

명령어의 구조

무엇을 수행하라(연산 코드), 무엇을 대상으로(오퍼랜드)

명령어는 연산 코드와 오퍼랜드로 구성됨

 

 

 

오퍼랜드

  • 연산에 사용될 데이터 or 연산에 사용될 데이터가 저장된 위치(주소필드)
  • 보통 주소필드(연산에 사용될 데이터가 저장된 위치)로 자주 사용되기 때문에 오퍼랜드를 주소필드라고 부르기도 함
  • 오퍼랜드는 없거나 여러개가 될 수도 있다. 위의 그림에서는 오퍼랜드가 2가지

연산 코드

  • 데이터 전송
  • 산술/논리 연산
  • 제어 흐름 변경
  • 입출력 제어
  • *** 연산 코드의 종류 & 생김새는 cpu마다 다르다.**

대표적인 연산 코드의 종류

  • *** cpu마다 다르기 때문에 이런 유형의 코드들이 대강 있구나 정도만!**
  • 데이터 전송
    • MOVE : 데이터를 옮겨라(레지스터에서 다른 레지스터로 데이터 옮길 때)
    • STORE : 메모리를 저장하라(메모리의 어떤 값을 혹은 어떤 메모리 위치에 저장되어 있는 값을 저장해라)
    • LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
    • PUSH : 스택에 데이터를 저장하라
    • POP : 스택의 최상단 데이터를 가져와라
  • 산술/논리 연산
    • ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곱셈 / 나눗셈을 수행하라
    • INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라
    • AND / OR / NOT : AND / OR / NOT 연산을 수행하라
    • COMPARE : 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라
  • 제어 흐름 변경
    • JUMP : 특정 주소로 실행 순서를 옮겨라
    • CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라(어떤 값이 0보다 클 때만 102번지에 있는 값을 실행해라)
    • HALT : 프로그램의 실행을 멈춰라
    • CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라(보통 함수 실행 시 사용, 주로 밑에 RETURN과 함께 쓰인다. ) 리턴 주소 저장한 채 특정 주소를 실행해라.. 즉 특정 함수 실행하면 리턴을 통해 되돌아오는 경우에 쓰임 특정 함수 실행 시 순서 : 함수 실행 → 함수가 저장되어 있는 메모리 주소 공간에 있는 명령어들 실행 → 다 실행 했다면 다시 함수를 호출했던 그 부분으로 돌아와야됨, 즉 리턴해야 됨
    • RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
  • 입출력 제어
    • READ (INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
    • WRITE (OUTPUT) : 특정 입출력 장치로 데이터를 써라
    • START IO : 입출력 장치를 시작하라
    • TEST IO : 입출력 장치의 상태를 확인하라

명령어 주소 지정 방식

  • 유효 주소 (Effective address)
    • 연산에 사용할 데이터가 저장된 위치

(참고 : 오퍼랜드에 값을 저장하면 오퍼랜드가 많아질수록 적은 데이터만 넣을 수 있지만 위치를 저장하고 해당 위치에 값을 저장하면, 만약 한줄당 16비트라고 가정 시에 온전히 16비트 공간을 값으로 채울 수 있음.

만약 총 16비트 사용할 수 있고 연산코드 4비트, 오퍼랜드 12비트 할당 시에 오퍼랜드가 4개가 되면 각 오퍼랜드는 3비트까지의 값밖에 저장 못하게 됨)

  • 명령어 주소 지정 방식 (addressing modes)
    • 연산에 사용할 데이터가 저장된 위치를 찾는 방법
    • 유효 주소를 찾는 방법
    • 다양한 명령어 주소 지정 방식들이 존재
      • 즉시 주소 지정 방식 (immediate addressing mode)
        • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
        • 가장 간단한 형태의 주소 지정 방식
        • 연산에 사용할 데이터의 크기가 작아질 수 있지만, 빠름
      • 직접 주소 지정 방식 (direct addressing mode)
        • 오퍼랜드 필드에 유효 주소 직접적으로 명시
        • 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦
      • 간접 주소 지정 방식 (direct addressing mode)
        • 오퍼랜드 필드에 유효 주소의 주소를 명시
        • 앞선 주소 지정 방식들에 비해 속도가 느림
        • 단점 : cpu가 계속 메모리 뒤적뒤적 해야함 → cpu가 메모리 뒤적뒤적 거리는 속도는 느려서 메모리 뒤적 거리는 과정은 줄이는게 좋긴 함..
      • 레지스터 주소 지정 방식 (Register addressing mode)
        • 연산에 사용할 데이터가 저장된 레지스터 명시
        • cpu가 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름.. 당연 레지스터는 cpu 안에 있으니.. 위의 직접 주소 방식보다는 좀 더 빠름
      • 레지스터 간접 주소 지정 방식(register indirect addressing mode)
        • 연산에 사용할 데이터를 메모리에 저장
        • 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시

'혼자 공부하는 컴퓨터구조+운영체제' 카테고리의 다른 글

메모리와 캐시 메모리  (0) 2023.09.10
cpu의 성능 향상 기법  (0) 2023.09.09
CPU의 작동 원리  (1) 2023.09.05
데이터, 0과 1  (0) 2023.08.26
컴퓨터 구조  (0) 2023.08.16
Comments