일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Constraint
- Reverse Engineering
- BOJ
- struct
- 2020.06.14
- UIView
- class
- 모달인듯 모달 아닌 뷰
- stl
- 표준 템플릿 라이브러리
- list
- Reversing
- Swing
- SWiFT
- Animation
- 2020.04.19
- vector
- scroll
- ios
- 2020.05.17
- NavigationBar
- UIPanGestureRecognizer
- 백준 1920
- 알고리즘
- 스택
- 컴퓨터 구조
- 컴퓨터구조
- Stack
- 순차 컨테이너
- 백준 10828
- Today
- Total
야금야금
#2-(2) 컴퓨터 구조 - 어셈블리 명령어 본문
컴퓨터 프로그래밍 언어는 상위 프로그래밍 언어와 하위 프로그래밍 언어로 나뉜다.
사용자는 상위 프로그래밍 언어(C, C++ 등)를 이용해 코드를 작성하고 이 언어는 컴파일러나 인터프리터에 의해 기계어로 번역되어 컴퓨터가 해당 작업을 수행하게 한다.
하위 프로그래밍 언어 중 어셈블리어란 기계어를 사람이 사용하는 언어에 가깝게 문자로 기호화한 것이다.
명령어가 CPU에서 처리될 때 어셈블리 언어의 형태로 처리되며 (CPU에 따라 어셈블리 언어의 형식이 다르다)
어셈블리어가 번역되는 작업을 어셈블(Assemble)이라 한다.
어셈블리 명령어는 다음과 같은 형식을 갖는다.
레이블 부 (Lable)
: JUMP, LOOP와 같은 순환/반복 명령에서 CPU실행을 해당 레이블로 이동시킬 때 사용한다
레이블을 생성할 때에는 8문자 이내의 영문자/숫자를 사용하며 이름에 공백이 포함될 수 없다.
연산 부 (Operation)
: 명령어 또는 지시어로 구성되어 있다.
피연산자 부 (Operand)
: 레지스터 이름, 정수, 라벨, 연산자, 주소 등으로 구성된다.
주석문 부(Comment)
: 세미콜론으로 시작한다.
아래 4개의 코드가 실행되는 과정을 예로 들어보자 우선 각 명령어의 동작은 다음과 같다
LOAD : 기억장치로부터 데이터 적재
ADD : 덧셈
STOR : 기억장치로 데이터 저장
JUMP : 해당 주소로 이동
명령어 동작을 살펴보면 데이터를 가져와서 더한 후 저장하고 다음 부분으로 넘어간다고 유추할 수 있다.
해당 과정을 자세하게 살펴보도록 하자
[단계 1]
프로그램 카운터(이하 PC)에 명령어 수행의 시작 주소인 100이 담긴다. 명령어 레지스터(이하 IR)에 해당 주소의 데이터가 저장된다.
[단계 2]
컴퓨터는 기계어로 명령어를 처리하기 때문에 LOAD나 ADD 같은 명령어도 약속된 기계 코드로 표현된다.
위의 1250에서 1은 LOAD의 약속된 기계코드로서 1250은 250번지에 저장된 데이터를 가져오라(LOAD)는 뜻으로 불러온 값은 누산기(이하 AC)에 저장된다. 250번지에 4라는 값이 들어있다면 AC에 4가 저장되고 PC는 다음 주소 값을 가리키게 된다.
[단계 3]
PC가 가리킨 다음 주소를 보면 5251이라는 데이터가 저장되어있다. 여기서 5는 더하라(ADD)는 명령어의 약속된 기계코드이다. 따라서 5251은 251번지에 저장되어있는 값을 가져와서 더하라는 뜻이 된다. 그렇다면 어떤 값과 더하는 것일까?
[단계 4]
더하는 값은 [단계 2]에서 AC에 들어있는 4가 된다. 따라서 AC에 저장된 4와 3이 ALU에서 더해지고 결과값인 7이 다시 AC에 들어간다. PC는 다음 주소 값을 가리키게 된다.
[단계 5, 6]
다음 주소의 2251을 보자. 여기서 2는 저장하라(STOR)는 약속된 기계코드이다. 따라서 AC에 들어있는 7이라는 값이 해당 주소인 251번지에 저장되는 것이다.
※기계 코드의 목적어는 전 명령어를 통해 AC에 들어있는 값이라고 생각하면 편할 것 같다.
"AC의 4를" 해당 주소의 데이터 3과 더해라
"AC의 7을" 해당 주소에 저장해라
[단계 7, 8]
PC가 가리키는 다음 명령어를 살펴보면 8170이 보인다. 여기서 8은 해당 주소로 이동해라(JUMP)라는 약속된 기계 코드이다. 따라서 PC의 값이 170으로 바뀌게 된다.
명령어 집합(instruction set)
- CPU가 수행할 동작을 정의하는 2진수 코드로 된 명령어들의 집합
- 일반적으로 어셈블리 코드 형태로 표현됨
- CPU의 사용목적, 특성에 따라 결정됨
명령어 집합 설계를 위해 결정되어야 할 사항들
- 연산 종류 : CPU가 수행할 연산들의 수와 종류 및 복잡도
- 데이터 형태 : 연산을 수행할 데이터들의 형태, 데이터의 길이(비트 수), 수의 표현 방식
- 명령어 형식 : 명령어의 길이, 오퍼랜드 필드들의 수와 길이
- 주소 지정 방식 : 피연산자의 주소를 지정하는 방식
명령어 형식
연산 코드 :
- 함수 연산 기능 : 산술 연산이나 논리 연산 수행
- 전달 기능 : CPU와 주기억장치 사이, CPU 내의 레지스터 간의 정보교환과 적재, 저장 기능을 수행
- 제어 기능 : 프로그램의 수행 흐름을 제어
- 입출력 기능 : CPU와 외부 장치들 간의 데이터 이동 수행
오퍼랜드 : 연산을 수행하는데 필요한 데이터 혹은 데이터의 주소
[문제]
참고) 2019 컴퓨터 구조 호준원 교수님 강의노트,
디지털 논리와 컴퓨터 설계, Harris et al. (조영완 외 번역), 사이텍 미디어, 2007,
컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍처), 신종홍 저, 한빛미디어, 2011
'SWING > 컴퓨터구조' 카테고리의 다른 글
#4 컴퓨터 구조 - 명령어 형식 (0) | 2020.05.30 |
---|---|
#3(2) 컴퓨터 구조 - 메모리 구조 & 레지스터 종류 (0) | 2020.05.23 |
#3 컴퓨터 구조 - 명령어를 효과적으로 처리하기 위한 기법 (0) | 2020.05.23 |
#2-(1) 컴퓨터 구조 - 컴퓨터 정보의 표현 (0) | 2020.04.17 |
#1 컴퓨터 시스템의 구성요소 & CPU 구조 및 동작 과정 (0) | 2020.04.12 |