본문 바로가기
흔한 학교 생활/컴퓨터 코딩 데이터

[마이크로프로세서] 명령어 처리과정, 레지스터 동작

by 흔한 학생 2024. 3. 12.
반응형

[마이크로프로세서] Accumulator, Flag resistor 레지스터

A: Accumulator resistor 연산의 결과를 저장하는 레지스터 입니다. F: Flag resistor Flag resistor 는 실행 중 판단을 할 수 있도록 도와주는 레지스터 입니다. 8비트의 F 레지스터의 구성에 대해 알아보겠습니

studentstory.tistory.com

이번에는 다양한 명령어의 처리과정동작에 대해 알아보겠습니다.
전전 글에서 명령어의 크기 기준으로 1바이트, 2바이트, 3바이트 3가지 크기의 명령어가 존재했습니다.
각 크기의 명령어 예시와 처리과정, 동작 방법에 대해 더 자세히 알아보겠습니다.
명령어를 암기하기보단 처리 과정을 이해한다는 느낌으로 봐주시면 좋겠고
이전 글에서도 말했듯 마찬가지로 8085 프로세서 기준 설명입니다.

[1] 1바이트 명령어

1바이트 명령어는 OPcode 로만 구성이 됩니다.

MOV C.A 
0 1 0 0 1 1 1 1 
명령: A를 C로 옮김(복제)

해당 MOV 명령어에는 destination과 source가 존재합니다. 
밑줄 친 001이 C, 111이 A에 해당합니다.
때문에 111인 A가 source 복사대상, 001인 C가 붙여넣는 목적지가 됩니다.

 

MOV A.C 
0 1 1 1 1 0 0 1
명령: C를 A로 옮김(복제)

마찬가지로 이렇게 적용할 수도 있습니다.
다음은 ADD 명령어 입니다.
 

ADD B
1 0 0 0 0 0 0 0
명령: B와 A를 더함

이 명령어에도 source가 있는 것일까요?
네 있습니다. 끝 세자리 000이 바로 B를 가리키는 것입니다.
해당 코드에 A가 존재하지 않는 이유는 해당 프로세서는 연산 시 A와 연산하도록 고정되어 있기 때문입니다. 
A와 연산하고 저장하는 곳도 A 입니다. 
 
그럼 source가 없이 OPcode만 존재하는 것이 있을까요?

CMA
0 0 1 0 1 1 1 1
보수 변환

이 코드는 A의 보수를 저장하며 source는 없습니다. 


[1-1] 동작 방법

PC에 저장된 주소 데이터(16비트)가 address bus에 실립니다.
디코더를 거쳐서 해당 메모리주소의 메모리가 enable됩니다.
마이크로프로세서는 OPcode 를 읽기위해 MEMR 신호를 보냅니다.
OPcode가 data bus를 통해 실려가고 PC가 1증가합니다.
OP code는 마이크로 프로세서에 와서 instruction 디코더에서 해석되고 명령어가 실행됩니다.


[2] 2바이트 명령어

MVI A.32H
0 0 1 1 1 1 1 0
0 0 1 1 0 0 1 0

opcode에 destination이 존재합니다.
OPcode 다음의 값을 저장하며 마찬가지로 목적지를 설정할 수 있습니다.
값이 존재하기 때문에 한 바이트를 더 사용합니다.
 

MVI B.32H
0 0 0 0 0 1 1 0
0 0 1 1 0 0 1 0

[2-1] 동작 방법

PC에 저장된 주소 데이터(16비트)가 address bus에 실립니다.
디코더를 거쳐서 해당 메모리주소의 메모리가 enable됩니다.
마이크로프로세서는 OPcode 를 읽기위해 MEMR 신호를 보냅니다.
OPcode가 data bus를 통해 실려가고 PC가 1증가합니다.
OP code는 마이크로 프로세서에 와서 instruction 디코더에서 해석되고 명령어가 실행됩니다.


(반복) 다음 차례는 간단히 말하면
다음 주소를 가리키는 PC가 address bus에 실립니다.
메모리가 enable되고 마이크로프로세서가 $\overline{\textrm{MEMR}}$ 신호를 보내고 값을 A에 저장합니다(실행).
즉 처음 읽는 코드는 OPcode로 읽습니다.


[3] 3바이트 명령어

LDA 2050H 
0 0 1 1 1 0 1 0
0 1 0 1 0 0 0 0
0 0 1 0 0 0 0 0
2050번지의 값을 A에 저장

이때 LD는 Load이며 메모리에서 A 레지스터로 불러오는 것을 의미합니다.
반대로 Store은 메모리에 저장하는 것입니다.
알다시피 주소는 16비트로 구성되기에 2바이트의 공간이 필요합니다.
여기서 첫 번째 바이트는 OP code를 의미하고 두 번째는 50, 세 번째는 20을 의미합니다.


[3-1] 동작 방법

PC에 저장된 주소 데이터(16비트 2000H)가 address bus에 실립니다.
디코더를 거쳐서 해당 메모리주소의 메모리가 enable됩니다.
마이크로프로세서는 OPcode 를 읽기위해 MEMR 신호를 보냅니다.
OPcode가 data bus를 통해 실려가고 PC가 1증가합니다.
OP code는 마이크로 프로세서에 와서 instruction 디코더에서 해석됩니다.


PC에 저장된 2001H 가 address bus에 실립니다.
디코더를 거쳐 enable 되고 마이크로프로세서는 MEMR 신호를 보냅니다.
50H가 data bus에 실려가고 PC가 1 증가합니다.
50H는 임시 레지스터 Z에 저장됩니다.


PC에 저장된 2002H가 address bus에 실립니다.
디코더를 거쳐 enable되고 마이크로프로세서는 MEMR 신호를 보냅니다.
20H가 data bus에 실려가고 PC가 1 증가합니다.
20H는 임시 레지스터 W에 저장됩니다.


20H 50H가 address bus에 실립니다.
디코더를 거쳐서 통해서 2050H 주소의 메모리가 enable 됩니다.
마이크로프로세서는 MEMR 신호를 보냅니다. 
메모리에 있는 값인 45H가 data bus에 실려가고 PC가 1 증가합니다. 
마이크로프로세서가 값을 A에 저장합니다.


주소 활용

C언어에서 포인터, 즉 주소를 저장하려고 할 때는 어떻게 할까요?
대부분의 레지스터는 8비트인데 주소는 16비트 입니다.
이때 두 개의 레지스터를 사용해 주소를 저장할 수 있습니다.
아무 두 레지스터가 아닌 B&C, D&E, H&L 세 쌍만 가능하며 이를 Resister Pair 라고 합니다.
LDAX 는 레지스터 쌍에 저장된 주소의 값을 A에 불러옵니다.

그렇다면 이러한 명령어는 크기가 어떻게 될까요?

3바이트라고 생각하기 쉽지만 1바이트 명령어입니다.
이유는 명령어에 주소가 들어가는 것이 아닌 명령어에는
가져올 (주소가 입력되어있는)register pair 만 알려주면 주소에 접근할 수 있기 때문입니다.

LDAX B
0 0 0 0 1 0 1 0
BC 주소의 데이터를 A로 불러옵니다.

이때도 source가 존재하는데 밑줄친 00 부분입니다.

LDAX D
0 0 0 1 1 0 1 0

 
이때 왜 두 자리로 나타낼 수 있냐 물으실 수도 있습니다.
이유는 register pair 이기때문에
두 자리로 충분히 구분할 수 있습니다.

00B
01D
10H
11A


이때 BC가 아닌 B라고만 나타내며 AF 쌍은 사용하지 않습니다.


비슷하게 MOV r,M 명령어가 있습니다
이때 M은 메모리가 아닌 H L 쌍 레지스터가 가리키는 주소의 메모리 값을 의미합니다.
예시로 알아보겠습니다.

MOV B,M
0 1 0 0 0 1 1 0
명령: 가리키는 값을 B에 저장

 
H에 70H, L에 80H 가 저장되어 있다면 7080H 주소의 값을 B에 저장합니다.
 

MOV C,M
0 1 0 0 1 1 1 0
명령: 가리키는 값을 C에 저장

 


이렇게 동작하는 과정에 대해 이해하셨길 바랍니다.
 
중요한 것은 어떤 명령어가 있는지보다 다양한 명령어가 어떻게 동작하는지입니다.
그리고 마이크로프로세서의 기본동작에는 크게 4가지, 작게는 5가지로 볼 수 있는데요.
바로 Mem Read, Mem Write, I/O Read, I/O Write 입니다.
5개 중 OP code Fetch를 가장 첫 번째로 수행한다는 것 또한 기억하시기 바랍니다.

반응형