Topic
The purpose of this applied session is getting to know MARIE computer architecture and assembly language.
이 적용 세션의 목적은 마리 컴퓨터 아키텍쳐와 어셈블리어에 대해 알아가는 것입니다.
어셈블리어(Assembly Language)?
어셈블리어(Assembly Language)는 컴퓨터의 기계어(Machine Code)를 사람이 이해하기 쉽게 표현한 저수준(low-level) 프로그래밍 언어입니다.
즉, CPU가 직접 실행하는 기계어(이진 코드)와 프로그래머가 이해할 수 있는 문자 코드(심볼릭 코드) 사이의 다리 역할을 합니다.
The MARIE.js is a simulator built in JavaScript simulating a very simple computer architecture known as Machine Architecture that is Really Intuitive and Easy (MARIE) developed at Purdue University. We will use the MARIE simulator to learn about basic computer architecture and assembly language programming. It is available here.
MARIE.js
marie.js.org
Load syNum / 000
Add syNum / 001
Store syNum / 002
Halt / 003
syNum, DEC 3 / 004
실행 과정
- syNum(3)을 AC(누산기)에 로드 → AC = 3
- syNum(3)을 AC에 더함 → AC = 3 + 3 = 6
- AC의 값을 다시 syNum에 저장 → syNum = 6
- 프로그램 종료
즉, syNum의 값을 3에서 6으로 증가시키는 코드!

(a) MARIE 메모리에서 프로그램을 찾을 수 있습니까? 프로그램의 첫 번째 줄과 마지막 줄의 메모리 주소는 무엇입니까?
- MARIE는 **메모리 주소를 3자리 16진수(000~FFF)**로 저장하는 구조를 가짐.
- 프로그램의 첫 번째 명령어가 위치한 주소와 마지막 명령어가 위치한 주소를 찾아야 함.
- 프로그램의 첫 번째 주소: 000
- 프로그램의 마지막 주소: 003
(b) 프로그램이 MARIE 메모리에 어떤 형식으로 저장됩니까? 데이터 “DEC 3”은 어떻게 저장됩니까?
- MARIE는 명령어와 데이터를 16비트(2바이트)로 저장.
- "DEC 3"은 10진수 3(0000 0000 0000 0011)로 저장됨.
- MARIE 메모리에 저장된 형식:
- 명령어는 **16비트 바이너리(2바이트)**로 저장됨.
- 예를 들어 Load는 1004 같은 16진수로 표현됨.
- "DEC 3" 저장 방식:
- DEC 3은 메모리 주소 **004**에 0006으로 저장됨.
- 여기서 0006은 3 + 3 = 6이 된 값이 저장된 상태임.
- MARIE 메모리에 저장된 형식:
(c) MARIE 메모리의 첫 번째 주소와 마지막 주소는 무엇입니까?
- 첫 번째 주소: 일반적으로 프로그램이 로드되는 0x000.
- 마지막 주소: MARIE 메모리는 **12비트 주소 체계를 가지므로 0xFFF(4095번지)**가 마지막 주소.
- MARIE의 메모리 범위는 **000 ~ FFF (16진수 기준 4096개 주소)**이므로:
- 첫 번째 주소: 000
- 마지막 주소: FFF
- MARIE의 메모리 범위는 **000 ~ FFF (16진수 기준 4096개 주소)**이므로:
(d) 변수 “num”을 사용하여 “DEC 3”을 참조하도록 프로그램을 다시 작성하시오.
- 원래 프로그램에서 DEC 3을 직접 참조하는 방식 대신 "num" 변수를 사용해야 함.
- 예제에서 num, DEC 3을 통해 변수를 선언하고, 코드에서 해당 변수를 참조하도록 수정해야 함.
Load num
Add num
Store num
Halt
num, DEC 3
Branching
begin, Input
Store myNum
Load myNum
Add topUp
Store myNum
Output
Jump begin
Halt
myNum, DEC 0
topUp, DEC 3
## 설명 ##
begin, Input ; 사용자가 입력
Store myNum ; 입력값 저장
Load myNum ; myNum 불러오기
Add topUp ; topUp(3) 더하기
Store myNum ; 새로운 값 저장
Output ; 결과 출력
Jump begin ; 다시 시작 (무한 반복)
Halt ; 하지만 실행되지 않음 (Jump 때문에)
myNum, DEC 0 ; 입력값 저장 변수
topUp, DEC 3 ; 더할 값 3
Jump begin이 추가되어 프로그램이 무한 반복됨.
사용자가 값을 입력할 때마다 3을 더한 결과가 계속 출력됨.
Halt 명령어는 실행되지 않음. (Jump 때문에 도달하지 않음)
begin, Input
Store myNum
Skipcond 400 / if AC = 0, skip next instruction
Jump cont
Jump end
cont, Load myNum
Add topUp
Store myNum
Output
Jump begin
myNum, DEC 0
topUp, DEC 3
end, Halt
이렇게 하면 Skipcond 400(입력값이 0보다 작을 때) cont로, 아니면 end로 건너뜀