(밑바닥부터 만드는 컴퓨팅 시스템 2판, 인사이트(insight), 2023)을 학습하고 개인 학습용으로 정리한 내용입니다.
주어진 값 n에 대해 \( 1 + 2 + 3 + ... + n \) 덧셈을 계산하는 프로그램이다.
RAM[0] = n
RAM[1] = 덧셈 결과
예제 프로그램은 '의사코드'와 '핵 어셈블리 코드'를 같이 보여주고 있다.
어셈블리 코드를 작성하기 전, 의사코드를 작성하는 것은 저수준 프로그램 개발에서 권장되는 방법이다.
의사코드를 먼저 작성 후, 의사 명령어를 하나 이상의 어셈블리 명령어로 바꿔가는 것을 추천한다.
의사코드 | 핵 어셈블리 코드 |
i = 1 | // i = 1 |
sum = 0 | @i |
LOOP: | M=1 |
if ( i > R0 ) goto STOP | // sum = 0 |
sum = sum + 1 |
@sum |
i = i + 1 |
M=0 |
goto LOOP |
(LOOP) |
STOP: | // if ( i > R0 ) goto STOP |
R1 = sum |
@i |
D=M | |
@R0 | |
D=D-M | |
@STOP | |
D;JGT | |
// sum = sum + 1 | |
@sum | |
D=M | |
@i | |
D=D+M | |
@sum | |
M=D | |
// i = i + 1 | |
@i | |
M=M+1 | |
// goto LOOP | |
@LOOP | |
0;JMP | |
(STOP) | |
// R1 = sum | |
@sum | |
D=M | |
@R1 | |
M=D | |
(END) | |
@END | |
0;JMP |
프로그램의 마지막에는 무한 루프가 있는데, 이는 핵 프로그램을 종료할 때 권장되는 방법이다. 이 무한 루프가 없으면 CPU는 불러오기-실행하기(fetch-execute) 논리에 따라, 현재 프로그램의 마지막 명령어 다음 위치의 명령어가 뭐든 간에 메모리에서 불러와서 계속 실행하려 들 것이다. 이는 예측할 수 없고 경우에 따라 위험한 결과를 초래할 수 있다.
'밑바닥부터 만드는 컴퓨팅 시스템 (Nand to Tetris)' 카테고리의 다른 글
[Chapter 4] project 04 (3) | 2024.03.02 |
---|---|
[Chapter 4] 핵 기계어 명령어 (0) | 2024.02.29 |
[Chapter 4] 핵 기계어 문법 (0) | 2024.02.27 |
[Chapter 4] 핵 기계어 (0) | 2024.02.23 |
[Chapter 4] 기계어 (Machine Language) (0) | 2024.02.20 |