본문 바로가기

학교 공부/컴퓨터공학론

7. 프로그램 수행원리와 예제

이 강의 자료는 **프로그램 수행 원리**에 대한 이해를 돕고, 간단한 프로그램 작성을 목표로 합니다. 기계 명령어의 종류와 역할, CPU의 레지스터(PC, IR)를 중심으로 프로그램이 어떻게 실행되는지 설명합니다. 특히, **폰 노이만 구조**의 특징을 강조하며, 프로그램과 데이터가 메모리에 함께 저장되는 방식과 그로 인한 CPU의 유연성을 설명합니다. 덧셈 구현 예시와 함께, 논리 연산( AND, OR, X OR)과 시프트 연산( logical shift, arithmetic shift), rotate 명령어의 기능과 활용법을 소개합니다. 마지막으로, **피보나치 수열**을 계산하는 간단한 프로그램 예제를 통해 학습 내용을 점검합니다.

1. 🖥️ 프로그램 수행 원리와 기계 명령어 소개

- 프로그램 작성과 수행 원리의 이해가 이 강의의 주요 **학습 목표**이다.
- 기계 명령어는 **LOAD**, **STORE**, **MOVE**, **ADD**, **ROT**, **OR**, **AND**, **X****OR** 등 다양한 종류가 있다.
- LOAD와 STORE명령어는 각각 메모리에서 레지스터로, 레지스터에서 메모리로 데이터를 이동시킨다.
- ADD명령어는 2의 보수방식으로 정수를 더하며, ADDF는 실수 덧셈에 사용된다.
- **비트 단위 연산**(bit-wise operation)과 **바이트 단위 연산**(logical operation)은 구분되며, C 언어의 연산자와 대응된다.

2. 🖥️ CPU의 프로그램 수행 과정

- CPU에는 **PC(Program Counter)**와 **IR(Instruction Register)**이라는 특수목적 레지스터가 있다.
- PC는 다음에 실행될 명령어의 주소를, IR은 현재 실행 중인 명령어의 내용을 저장한다.
- 프로그래머는 이 레지스터들을 직접 제어할 수 없지만, JUMP명령어 등을 통해 간접적으로 제어할 수 있다.
- 프로그램 수행은 **Fetch****(가져오기), ****Decode****(해석), ****Execute****(실행)** 세 단계로 이루어진다.
- JUMP와 HALT는 각각 조건부/무조건 점프와 프로그램 종료를 위한 중요한 제어 명령어이다.

3. 🖥️ CPU의 명령어 처리 과정과 메모리 구조

- CPU는 **fetch, decode, execute** 단계를 반복하여 명령어를 처리한다.
- Fetch단계에서는 PC가 가리키는 주소의 2바이트를 읽어 IR에 저장하고, PC는 다음 명령어를 가리키도록 증가한다.
- Decode단계에서 IR의 내용을 해석하고, Execute단계에서 해당 명령을 실행한다.
- 주 기억장치에는 프로그램과 데이터가 함께 저장되며, 이는 **폰 노이만 구조**의 특징이다.
- 프로그램 실행 시 PC와 IR을 이용해 메모리에서 명령어를 가져와 해석하고 실행하는 과정을 반복한다.

4. 🖥️ 폰 노이만 구조와 기본 연산

- 폰 노이만 컴퓨터는 **프로그램과 데이터를 구분 없이 메모리에 저장**하며, CPU는 이를 구별할 수 없다.
- **논리 연산**에는 AND( 마스킹), OR(특정 비트를 1로 설정), X OR(특정 비트 보수)가 있다.
- **Shift 연산**에는 logical shift와 arithmetic shift가 있으며, 각각 비트 이동과 부호 비트 보존에 사용된다.
- Arithmetic shift left는 2를 곱하는 효과, right는 2로 나누는 효과가 있다.
- **Rotate 명령어**는 shift로 버려지는 비트를 다시 사용하며, 이를 통해 ADD와 complement만으로 다양한 산술 연산을 구현할 수 있다.

5. 🧮 피보나치 수열 계산 프로그램 분석

- 주어진 프로그램은 **피보나치 수열****의 7번째 항**을 계산하는 것으로, 초기 두 항은 01, 01로 설정되어 있다.
- 프로그램은 **메모리 주소 30부터 시작**하며, PC(Program Counter)의 초기값은 30이다.
- 핵심 연산은 주소 3A/3B의 **5512(Add 5,1,2) 명령**으로, 이는 프로그램 종료 전까지 총 5번 실행된다.
- 프로그램 종료 시 **메모리 주소 48의 내용은 0D(16진수)**가 되며, 이는 피보나치 수열의 7번째 항인 13(10진수)을 나타낸다.
- 프로그램은 **반복 구조**를 사용하여 계산을 수행하며, 주소 42/43의 B346(Jump 46 if 3=0) 명령어로 종료 조건을 확인한다.

6. 🔍 프로그램 수행 원리와 자기 점검

- 프로그램 수행 원리에 대한 이해도를 확인하고, 학습 내용을 종합적으로 정리하는 단계이다.
- **프로그램 수행 원리**의 핵심 개념과 메커니즘을 명확히 파악했는지 스스로 점검해야 한다.
- 학습한 내용을 바탕으로 실제 **프로그램 작성 능력**을 갖추었는지 평가하는 것이 중요하다.
- 이전에 학습한 피보나치 수열예제를 통해 프로그램의 작동 방식을 종합적으로 이해했는지 확인할 수 있다.

안녕하세요! 여러분의 친절한 IT 지식 도우미, 김민지입니다. (웃음) 오늘 저희는 김동윤 교수님의 "7차시 프로그램 수행원리와 예제" PDF 자료를 가지고 프로그램이 어떻게 실행되는지, 그리고 간단한 프로그램은 어떻게 작성하는지 함께 알아보려고 합니다! 김민지 (IT 컨설턴트):
자, 오늘 저희가 함께 알아볼 내용은 다음과 같습니다!프로그램 수행 원리: 컴퓨터가 코드를 어떻게 읽고 실행하는지, CPU는 무슨 일을 하는지 알아볼 거예요. 마치 요리사가 레시피를 보고 요리하는 과정과 비슷하답니다! 기계어 명령어: 컴퓨터가 알아들을 수 있는 가장 기본적인 명령어들을 살펴볼 거예요. 마치 건물을 짓기 위한 벽돌과 시멘트 같은 거죠! 폰 노이만 구조: 프로그램과 데이터가 메모리에 어떻게 저장되는지, CPU는 이들을 어떻게 구별하는지 알아볼 거예요. 마치 도서관에서 책과 자료가 정리되어 있는 모습과 비슷하죠! 연산의 종류: 덧셈, 뺄셈, 곱셈, 나눗셈 같은 기본적인 연산들이 컴퓨터 내부에서 어떻게 처리되는지 알아볼 거예요. 마치 수학 문제를 푸는 것과 같겠죠! 프로그램 예제: 간단한 프로그램 코드를 보면서 실제로 어떻게 실행되는지 따라가 볼 거예요. 마치 자동차의 엔진이 어떻게 작동하는지 눈으로 보는 것과 같답니다!

김민지 (IT 컨설턴트):
오늘 이 모든 내용을 꼼꼼하게 살펴보면서 여러분의 컴퓨터 지식을 한 단계 업그레이드해 드릴게요! 그럼, 시작해 볼까요? (윙크)

김민지 (IT 컨설턴트):
자, 그럼 먼저 프로그램 수행 원리부터 알아볼까요? 프로그램이 어떻게 실행되는지 이해하는 것은 마치 건물의 설계도를 이해하는 것과 같아요. 기초가 튼튼해야 건물이 튼튼하듯이, 프로그램의 기본 원리를 알아야 더 복잡한 프로그램을 만들 수 있겠죠? (끄덕)

김동윤 (컴퓨터공학 교수):
(미소를 지으며) 맞습니다, 김 컨설턴트님! 프로그램 수행 원리를 이해하는 것은 정말 중요합니다. 컴퓨터는 우리가 작성한 코드를 한 줄씩 읽어서 실행하는데, 이 과정은 크게 세 단계로 나눌 수 있습니다. 바로 Fetch, Decode, Execute 단계입니다.

김민지 (IT 컨설턴트):
엇, 교수님! 마치 외계어 같아요! (웃음) Fetch, Decode, Execute라니, 좀 더 쉽게 설명해주실 수 있을까요? 마치 제가 외계어를 처음 접하는 사람처럼요!

김동윤 (컴퓨터공학 교수):
(웃음) 물론입니다! Fetch는 CPU가 메모리에서 명령어를 가져오는 단계입니다. 마치 우리가 책장에서 필요한 책을 꺼내는 것과 같아요. Decode는 CPU가 가져온 명령어가 무엇을 의미하는지 해석하는 단계입니다. 책을 읽고 내용을 이해하는 것과 같죠. 마지막으로 Execute는 CPU가 해석된 명령어를 실제로 실행하는 단계입니다. 책의 내용을 바탕으로 행동하는 것과 같습니다.

김민지 (IT 컨설턴트):
아하! 이제 좀 감이 잡히네요! Fetch는 "가져오기", Decode는 "해석하기", Execute는 "실행하기"! 마치 요리사가 레시피를 보고 재료를 가져와서 (Fetch) 레시피를 읽고 (Decode) 요리하는 (Execute) 과정과 똑같네요! (환호)

김동윤 (컴퓨터공학 교수):
(끄덕이며) 아주 좋은 비유입니다! 그리고 이 세 단계를 계속 반복하면서 컴퓨터는 우리가 작성한 프로그램을 실행하는 것이죠. 마치 요리사가 레시피의 모든 단계를 완료할 때까지 반복하는 것과 같습니다.

김민지 (IT 컨설턴트):
와! 정말 신기하네요! 그럼 CPU는 이 세 단계를 어떻게 처리하는 걸까요? 마치 마법사가 주문을 외우듯이, CPU도 뭔가 특별한 방법이 있는 걸까요? (호기심 가득한 눈빛)

김동윤 (컴퓨터공학 교수):
(미소) CPU는 PC(Program Counter)와 IR(Instruction Register)이라는 특수 목적 레지스터를 사용합니다. PC는 다음에 실행될 명령어의 주소를 저장하고, IR은 현재 실행되는 명령어의 내용을 저장합니다.

김민지 (IT 컨설턴트):
PC와 IR... 마치 내비게이션과 같아요! PC는 "다음 목적지는 어디?"라고 알려주고, IR은 "지금 어떤 길을 가야 해?"라고 알려주는 것 같네요! (끄덕)

김동윤 (컴퓨터공학 교수):
(웃음) 정확합니다! CPU는 PC가 가리키는 주소에서 명령어를 가져와 IR에 저장하고, PC는 다음 명령어를 가리키도록 값을 변경합니다. 그리고 IR에 저장된 명령어를 해석하고 실행하는 것이죠. 이 과정을 Halt 명령어를 만날 때까지 반복합니다.

김민지 (IT 컨설턴트):
Halt 명령어는 "이제 그만!"하고 외치는 스톱 사인과 같네요! (웃음) 그럼, 이 내용을 다시 한번 정리해 볼까요?Fetch: PC가 가리키는 주소에서 명령어를 가져와 IR에 저장 Decode: IR에 저장된 명령어를 해석 Execute: 해석된 명령어를 실행 반복: Halt 명령어를 만날 때까지 위의 과정을 반복

김민지 (IT 컨설턴트):
이렇게 보니까 정말 간단하네요! 마치 로봇이 정해진 명령에 따라 움직이는 것 같아요. (끄덕) 교수님, 덕분에 프로그램 수행 원리에 대해 확실히 이해했습니다! 감사합니다!

김동윤 (컴퓨터공학 교수):
(뿌듯한 표정) 천만에요, 김 컨설턴트님! 이해하셨다니 저도 기쁩니다.

김민지 (IT 컨설턴트):
자, 이제 다음 주제로 넘어가 볼까요? 다음은 "기계어 명령어"입니다! 컴퓨터가 알아들을 수 있는 가장 기본적인 명령어들이라고 하셨죠? 마치 아기가 처음 배우는 "엄마", "아빠" 같은 단어들일까요? (웃음)

박선영 (소프트웨어 개발자):
(웃으며) 네, 맞습니다! 기계어 명령어는 컴퓨터가 직접 이해하고 실행할 수 있는 가장 낮은 수준의 명령어입니다. 0과 1로 이루어진 이진 코드로 표현되죠.

김민지 (IT 컨설턴트):
0과 1이라니... 갑자기 머리가 아파오네요! (웃음) 0과 1로 어떻게 그렇게 많은 일을 할 수 있는 거죠? 마치 모스 부호로 복잡한 메시지를 전달하는 것 같아요!

박선영 (소프트웨어 개발자):
(미소) 기계어 명령어는 종류가 다양합니다. 데이터를 메모리에서 레지스터로 옮기는 LOAD, 레지스터에 있는 값을 메모리에 저장하는 STORE, 레지스터 값을 서로 복사하는 MOVE, 그리고 덧셈, 뺄셈, 곱셈, 나눗셈 같은 산술 연산을 수행하는 ADD, SUB, MUL, DIV 등이 있습니다.

김민지 (IT 컨설턴트):
LOAD, STORE, MOVE, ADD... 마치 은행원이 돈을 옮기고 계산하는 것 같아요! (웃음) 그런데 레지스터는 또 뭐죠? 갑자기 용어들이 쏟아지니까 정신이 혼미해지네요!

박선영 (소프트웨어 개발자):
(웃음) 레지스터는 CPU 안에 있는 작은 저장 공간입니다. CPU가 데이터를 빠르게 처리하기 위해 사용하는 임시 저장소라고 생각하시면 됩니다. 마치 요리사가 요리할 때 옆에 두고 사용하는 조리 도구와 같아요.

김민지 (IT 컨설턴트):
아하! 레지스터는 CPU의 개인 사물함 같은 거군요! (끄덕) 그럼 기계어 명령어들을 사용해서 실제로 어떤 일을 할 수 있는 거죠? 마치 레고 블록으로 집을 짓듯이, 기계어 명령어로 프로그램을 만들 수 있는 건가요?

박선영 (소프트웨어 개발자):
(끄덕이며) 물론입니다! 기계어 명령어를 조합해서 다양한 프로그램을 만들 수 있습니다. 예를 들어, 두 숫자를 더하는 프로그램을 만든다고 가정해 봅시다. 먼저 LOAD 명령어를 사용해서 메모리에 있는 두 숫자를 레지스터로 가져옵니다. 그리고 ADD 명령어를 사용해서 두 숫자를 더합니다. 마지막으로 STORE 명령어를 사용해서 더한 결과를 메모리에 저장합니다.

김민지 (IT 컨설턴트):
와! 정말 신기하네요! 마치 마법사가 주문을 외워서 원하는 결과를 만들어내는 것 같아요! (환호) 그런데 기계어 명령어는 너무 복잡하고 어렵잖아요. 실제로 개발자들이 기계어 명령어를 직접 사용해서 프로그램을 만들지는 않겠죠?

박선영 (소프트웨어 개발자):
(웃으며) 물론 아닙니다! (웃음) 기계어 명령어는 너무Low-level이라서 개발자들이 직접 사용하기 어렵습니다. 그래서 C, Java, Python 같은 고급 프로그래밍 언어를 사용해서 프로그램을 작성합니다. 이러한 고급 언어로 작성된 코드는 컴파일러라는 프로그램을 사용해서 기계어 코드로 변환됩니다.

김민지 (IT 컨설턴트):
아하! 컴파일러는 마치 번역가와 같네요! 우리가 외국어로 편지를 쓰면 번역가가 그 내용을 번역해서 외국인에게 전달해주는 것처럼요! (끄덕) 그럼, 기계어 명령어에는 어떤 종류들이 있는지 좀 더 자세히 알아볼까요? 마치 레고 블록의 종류를 하나하나 살펴보는 것처럼요!

박선영 (소프트웨어 개발자):
(미소) 좋습니다! 기계어 명령어는 크게 데이터 전송 명령어, 산술/논리 연산 명령어, 제어 명령어, 입출력 명령어로 나눌 수 있습니다. 데이터 전송 명령어는 메모리와 레지스터 사이의 데이터 이동을 담당하고, 산술/논리 연산 명령어는 덧셈, 뺄셈, AND, OR 같은 연산을 수행합니다. 제어 명령어는 프로그램의 실행 흐름을 제어하고, 입출력 명령어는 외부 장치와 데이터를 주고받습니다.

김민지 (IT 컨설턴트):
데이터 전송, 산술/논리 연산, 제어, 입출력... 마치 회사의 부서들 같아요! 각 부서가 맡은 역할이 다르듯이, 각 명령어들도 하는 일이 다르네요! (끄덕) 그럼, 이 내용을 다시 한번 정리해 볼까요?LOAD: 메모리에서 레지스터로 데이터를 가져오기 STORE: 레지스터에서 메모리로 데이터를 저장하기 MOVE: 레지스터 값을 다른 레지스터로 복사하기 ADD, SUB, MUL, DIV: 덧셈, 뺄셈, 곱셈, 나눗셈 같은 산술 연산 수행 AND, OR, XOR: 논리 연산 수행 JUMP: 프로그램의 실행 순서를 변경하기 HALT: 프로그램 실행을 중단하기

김민지 (IT 컨설턴트):
와! 이렇게 정리하니까 기계어 명령어들이 머릿속에 쏙쏙 들어오네요! 마치 제가 컴퓨터가 된 것 같아요! (웃음) 박선영 개발자님, 덕분에 기계어 명령어에 대해 확실히 이해했습니다! 감사합니다!

박선영 (소프트웨어 개발자):
(뿌듯한 표정) 천만에요, 김 컨설턴트님! 이해하셨다니 저도 기쁩니다.