기본 콘텐츠로 건너뛰기

COMP2300 어셈블리 프로그래밍: 포큐 아카데미 재수강 후기


# COMP2300 어셈블리 프로그래밍: 포큐 아카데미 재수강 후기
![](https://raw.githubusercontent.com/jubin-park/blog.jubinpark.com/refs/heads/main/post/2026/04/25/assets//COMP2300.png)

포큐 아카데미 COMP2300 어셈블리 프로그래밍 과목을 2023년 9월에 FAILED를 받았으며, 이후 2026년 1월 학기에 재도전하고 작성하는 후기글입니다. 정보 습득에 도움이 되시길 바랍니다.

### 저수준 프로그래밍, 수준 낮은 프로그래밍?

저수준이라는 단어만 놓고 볼 때면, 문득 '하찮은 수준인가?' 같은 생각을 하곤 했습니다. 영어로 번역한 단어인 'low-level'을 봐도 저레벨, 쪼렙 같은 단어들이 생각이 납니다. 반대로 고수준(high-level)이라고 하면, 고급적이고 세련된 느낌이 듭니다.

위 단어들은 일상적이 아닌, 기술적인 용어로 보는 게 올바릅니다.

---

(원문)
- **High-level** describe those operations that are more **abstract** and general in nature; wherein the overall goals and systemic features are typically more concerned with the wider, macro system as a whole.
- **Low-level** describes more specific individual components of a systematic operation, focusing on **the details of rudimentary micro functions** rather than macro, complex processes. Low-level classification is typically more concerned with individual components within the system and how they operate.

(파파고 번역) 
- **High-level**은 본질적으로 더 **추상적**이고 일반적인 작업을 설명합니다. 여기서 전체 목표와 시스템적 특징은 일반적으로 더 넓은 거시 시스템 전체와 더 관련이 있습니다.
- **Low-level**은 거시적이고 복잡한 프로세스보다는 **기본적인 미세 기능의 세부 사항**에 초점을 맞춘 체계적인 작업의 보다 구체적인 개별 구성 요소를 설명합니다. Low-level 분류는 일반적으로 시스템 내의 개별 구성 요소와 그 작동 방식에 더 중점을 둡니다.

출처: [wikipedia](https://en.wikipedia.org/wiki/High-_and_low-level)

---

흔히 프로그래밍 언어에서, 저수준에 가까울 수록 기계가 이해하기 쉬운 쪽이고, 고수준에 가까울 수록 인간이 이해하기 쉽다고 표현합니다. 어셈블리어는 저수준에 가깝지만 CPU가 바로 읽고 실행할 수 있는 건 아니고, 어셈블리 코드 텍스트를 기계어 바이트코드로 변환된 것이 최종 저수준 언어의 상태라고 보면 됩니다.

### 선수과목

왠지 모르게 더 있을 것 같지만 필수적으로 기억해야 하는 일부 개념들을 아래에 적었습니다.

1. COMP1000: 소프트웨어 공학용 수학(C#)
	- **10진수 <=> 2진수, 16진수 변환**
	- 부동소수점과 IEEE754
	- 벡터와 행렬
	- 비트연산
2. COMP2200: C 언매니지드 프로그래밍
	- 포인터
	- 구조체 및 비트 멤버, 공용체
	- 함수와 스택

### 강의 구성 (일부)

#### 1. 시작 ~ 중간고사 이전 (6502 8비트 시대)

![pobs.png](https://raw.githubusercontent.com/jubin-park/blog.jubinpark.com/refs/heads/main/post/2026/04/25/assets//pobs.png)

- 컴퓨터 추상화 레이어
	- **저수준** 트랜지스터부터 **고수준** 어플리케이션까지
	- 강의에서는 장난감 블록으로 비유합니다.
	- 트랜지스터라는 블록을 조립해서, 논리게이트로 만들고.. 그걸 조립해서 가산기를 만들고.. ALU를 만들고.. 최종적으로 CPU가 만들어집니다.
	- 이렇게 고수준으로 올라갈수록 추상화가 이루어집니다.
		- 내가 어셈블리 언어를 모르지만 고수준 프로그래밍 C언어만 쓸 줄 알아도, 컴파일러의 도움으로 어셈블리어 -> 기계어 프로그램이 만들어지기 때문에 실행할 수 있습니다.
		- 내가 C#만 쓸 줄 알아도, 컴파일러가 C# 코드를 닷넷 중간 언어(IL, Intermediate Language)로 바꿔주고, JIT(Just-In-Time) 컴파일러가 런타임에 IL을 기계어로 바꿔주기 때문에 프로그램을 실행할 수 있습니다.
		- 내가 Java만 쓸 줄 알아도, 자바 컴파일러가 Java 코드를 바이트코드로 바꿔주고, JVM(Java Virtual Machine)가 바이트코드를 한줄씩 해석해서 기계어를 실행하거나, 또는 JIT가 동작하기 때문에 프로그램을 실행할 수 있습니다.
		- 내가 Python만 쓸 줄 알아도, Python 코드를 바이트코드로 바꾸고, PVM(Python Virtual Machine)이 바이트 코드를 한줄씩 해석해서 기계어를 실행하므로 프로그램을 실행할 수 있습니다.
		- (... 반복 ...)
		- **결론적으로 아무리 어떤 고수준 언어라 할지라도, 최종적으로 사용중인 CPU에 맞는 기계어로 변환해서 실행한다는 것이 핵심입니다.**
		- **그리고 프로그램 실행을 도와주는 주체는, 아주 사랑스럽고 소중한 OS입니다!**
	- 재미있는 컴퓨터의 역사를 배웁니다.
		- 앨런 튜링의 튜링 머신
		- 폰 노이만 아저씨의 컴퓨터 구조
	- MOS 6502 컴퓨터를 직접 만들거나, 6502를 시뮬레이트할 수 있는 프로그램 [POBS](https://github.com/POCU/COMP2300StarterPack/releases) 를 제공합니다.
		- LED, 논리게이트, CPU, ROM, RAM 등의 부품을 브레드보드에 꼽고 와이어로 연결하여 완성합니다.
		- 직접 만든 컴퓨터로 실제로 6502 어셈블리 코드를 작성하고 ROM에 플래시하여 실행할 수 있습니다.
		- POBS에서 각종 레지스터와 메모리 값을 명령어 step 단위로 디버깅할 수 있는 기능이 제공됩니다.
		- [POCU 아카데미 카카오톡 오픈 채팅방](https://open.kakao.com/o/pH8f3i8h)에 입장하면, 6502 컴퓨터 부품에 대한 정보를 얻거나 중고 구매를 하거나 운이 좋다면 나눔을 받을 수 있는 것으로 알고 있습니다. 조립을 실제로 원한다면 입장하여 정보를 얻는 게 좋겠습니다.
	- 6502 CPU가 프로그램을 실행하는 단계를 처음부터 단계별로 배웁니다.
	- 강사님께서 6502 CPU 명령어를 하나하나 친절히 설명해주십니다.
		- **갓난아기에게 음식을 호호 불어서 천천히 떠먹여준다는 느낌**으로 비유하는 게 어울릴 정도입니다.
		- 굉장히 친절해서 만족스러웠고, **어셈블리어에 대한 진입장벽을 초반에 낮출 수 있었습니다.**
		- 이 때 배운 명령어를 잘 숙지 및 정리하고 실습/과제 때 사용하면서 체화할 기회가 생겼습니다.
	- 고대 CPU라 그런지 상대적으로 레지스터나 명령어가 단순하게 적고, 이 단순한 명령어를 응용해서 다양한 코드를 작성하는 활동이 흥미로웠습니다. 창의력(또는 문제해결력)을 기를 수 있었습니다.
	- 비트 회전 연산의 존재를 처음 알았습니다. 고급 프로그래밍 언어에서는 경험해보지 못했기 때문에 매우 신기했습니다.
	- 조건문: 결국 레지스터 플래그 값에 따라서 jump 를 하냐 마냐일 뿐이었습니다.
	- 반복문: 실체를 깨닫는 좋은 배움이 됐습니다. (힌트: 결국 조건문)
	- 함수를 호출하는 연산이 왜 무거운지 알 수 있으며, 함수를 사용하지 말아야 한다는 사람들의 주장과 그 이유를 알 수 있었습니다.
	- **평가값을 0과 비교하는 게** (개미 눈꼽만큼이지만) 성능이 더 빠른 이유를 알 수 있습니다. (힌트: 반복문에서 사용 시 큰 힘을 발휘할 수 있다!)
	- 함수 호출 규약을 직접 코딩을 통해 많이 연습할 수 있습니다.

#### 2. 중간고사 이후 (x86 16비트, FPU 시대)

![](https://raw.githubusercontent.com/jubin-park/blog.jubinpark.com/refs/heads/main/post/2026/04/25/assets//buildbot_cv.png)

- 6502와 인텔 8086 CPU의 명령어를 비교하면서 **델타학습**을 합니다.
	- 이제부터는 **갓난아기**를 벗어났기 때문에, 강사님은 추가적인 명령어가 이런 게 있다 정도로 알려주고, 자세한 사항은 직접 찾아봐야 합니다.
		- **강사님은 음식 재료들을 제공하고, 레시피는 우리가 직접 찾고 요리를 만들어 먹는다**는 것에 굳이 비유를 하면 되겠네요.
	- FPU 프로그래밍과 x87 명령어를 학습합니다. 80비트 확장 부동소수점을 내부적으로 사용한다는 사실이 저에게 신선한 충격을 안겨다주었습니다.
	- MS-DOS와 친숙해지는 계기가 됩니다. 어셈블리 코드를 ML(Microsoft Macro Assembler)로 빌드하고, CV(CodeView)로 레지스터 및 메모리 디버깅을 할 수 있습니다.
	- 인터럽트 개념을 배우고, MSDOS, BIOS 서비스를 직접 사용하는 경험을 얻을 수 있습니다.

#### 3. 후반부 (x86 32/64비트 시대, 벡터 연산)
- Intel, AMD사 그리고 SIMD 명령어의 역사를 배우는데 되게 자세합니다.
	- 다양하고, 기괴하고, 최대한 축약시켜도 이름이 긴 SIMD 명령어들이 쏟아져 나오는데, 많이 사용하지 않으면 익숙해지지 않아서 니모닉 이름도 외우기가 무척 어려웠습니다.
	- 액셀로 간단한 3D 프로그래밍 렌더링 체험을 할 수 있습니다. ([출처: 포프TV](https://youtu.be/aLyi0SkuKmY?si=GduFhnYjyMM5bXYu&t=594))
	- 32비트 인라인 어셈블리 프로그래밍을 재밌게 했습니다.

---
### 어셈블리 언어요? 외계어 같고, 관심도 없었고, 아예 몰랐어요

![](https://raw.githubusercontent.com/jubin-park/blog.jubinpark.com/refs/heads/main/post/2026/04/25/assets//binary_world.jpg)

*(DDP 워너브라더스 100주년 특별전 - 영화 매트릭스 존에서)*

컴퓨터공학부 1학년 시절 어느 교양시간. 이진법, '디지털 컴퓨터는 0과 1로만 돌아간다' 등의 내용을 수없이 들었지만 '그저 그렇구나~' 하고 대수롭지 않게 넘어갔던 기억이 납니다. 살면서 0과 1로만 코딩할 것도 아니고, 그보단 제게 닥친 C언어 과제 해결이 급선무였기 때문이었죠. 이후 디지털 논리회로는 배웠지만, 어셈블리어 과목은 학교에서 배우지 않았고 마침내 졸업을 하고 말았습니다. 고수준 프로그래밍 어느정도만 할 줄 아는, 흔한 컴공졸업생1 상태로 말입니다.

10진수 <=> 2진수 변환 알고리듬, 비트 플래그 쉬프트/마스킹, std::bitset, std::vector\ 등 바이너리를 다룰 일은 있었어도 어셈블리 언어까지 넘어갈 일은 없었습니다. 메모리 에디터 (Ollydbg, Cheat Engine 등)에서 메모리 뷰어로 본 적은 있었지만, 모두 제가 알아들을 수 없는 외계어라 생각하고 넘어갔습니다. 읽을 줄 몰랐기 때문이었죠.
### Hello Asm? (1st Tried)

처음으로 어셈블리 언어를 접했을 2023년 1월. 다녔던 전 회사와 게임 서버 프로그래밍 학원을 병행하기 시작했을 시기였습니다. 원장님께서 강조하신 말씀은, 내가 작성한 C++코드와 함께 어셈블리 코드까지 모두 보고 이해해야 한다는 것이었어요. Visual Studio 디버깅 모드에서 Disassembly 윈도우를 항상 띄우고 코딩하면서 한줄씩 관찰해야 한다고 하셨죠. 서버 개발 분야다 보니 성능 효율적인 코드를 짜야하기 때문이었습니다. 그 때 x86에서 사용하는 레지스터 중 ebp, esp, 함수(call, ret) 호출 명령어, 스택 정리 (add, push, pop) 정도 배웠습니다. 나머지 어셈블리 명령어들은 그냥 독학을 해야 했는데 어떻게 공부해야 할 지 몰랐습니다. 그렇게 따라가지 못하고 서버학원을 4개월 만에 그만두고 말았습니다.

### Hello Asm again... (2nd Tried)

2023년 9월, 포큐 신규과목 COMP2300 어셈블리 프로그래밍이 출시됐습니다. 저를 포함한 많은 사람들이 기대하고 있었던 과목이었죠. 신규 과목 첫 학기는 수강생분들이 적극적으로 피드백을 남기고 8086 컴퓨터 부품들을 잘 구해서 모아다가 만들 정도로 반응이 뜨거웠던 걸로 기억합니다.

그때 저는 회사일을 핑계삼아 온라인 강의를 미뤄서 보고, [POBS](https://github.com/POCU/COMP2300StarterPack/releases)으로 전선을 하나하나 연결하는 데에 전념했습니다. 겨우 실습 과제를 따라왔지만, 중간고사 준비를 어영부영 했었어요. 뻔하게도 결과는 처참했습니다. 이후 수강 포기도 신청하지 않은 채 완전히 손을 떼고 FAILED와 함께 종강했고요. COMP3500 이후로 두 번째 FAILED이라 그런지 좌절감을 많이 느꼈습니다. 회사 다니면서 공부하는 건 저에겐 과욕이자 시간 부족 및 능력 한계였다고 봅니다.

![](https://raw.githubusercontent.com/jubin-park/blog.jubinpark.com/refs/heads/main/post/2026/04/25/assets//202309_total_score.png)

### Hello Asm! (3rd Tried)

2024년 7월, 이전에 다녔던 서버학원에 다시 도전하고자 직장을 그만두고 학원을 재등록했습니다. 9개월을 다니다가 3분기 테스트에서 탈락했고 제대로 뻗어버렸습니다. 2025년 4월, 체중은 20kg 넘게 증가한 상태였고 그 동안 받았던 온갖 스트레스, 번아웃, 우울증, 패배주의, 무기력증이 저를 잠식하고 있었습니다. 더 이상 자신이 없었고, 아무것도 하고 싶지 않았어요. 제가 할 수 있는 최선은, 산책을 하거나 정신과에 가서 약을 처방받는 것 뿐이었습니다.

그러나 언제까지 이렇게 살 수는 없었습니다. 스스로 잡아먹히고 있는 이 상황을 벗어나고 싶었습니다. 새해 2026년을 맞이한 기념으로 하고 싶었지만 이루지 못한 것들 중, COMP2300 이 문득 눈에 들어왔습니다. 지금은 백수니 시간도 많을테니까 해낼 수 있을거라 믿었습니다. 물론 그러면서도 겁이 나고 무서웠고, 가끔은 스스로를 믿지 못했습니다. 지금 와서야 잘 해낸 걸 보면 조금은 자신감을 얻었지만 말이죠. 또한 새해에 운동을 시작하면서 작년보다 건강도 많이 좋아졌습니다.

![](https://raw.githubusercontent.com/jubin-park/blog.jubinpark.com/refs/heads/main/post/2026/04/25/assets//202601_scores.png)
![](https://raw.githubusercontent.com/jubin-park/blog.jubinpark.com/refs/heads/main/post/2026/04/25/assets//202601_achievement.png)

---

### 그래서 이거 배워서 뭐 할건데요?

어셈블리어 왜 공부하냐라는 질문을 받을 수 있습니다. 강의에서도 강사님이 자세하게 여러 답변을 해주시는데 그 내용은 생략하겠습니다.

회사에 가면 주로 고수준 언어로 협업해야 하니 어셈블리어로 코딩을 할 일은 거의 없겠지만, 적어도 어셈블리어를 볼 일은 생길 것 같아요. 만약 C++ 코드만 믿고 코딩한다 가정해보죠. 과연 그 코드가 내가 의도한 대로 동작할 것인지 의문을 가져야 합니다. 만약 회사 프로젝트의 컴파일러 최적화가 /O2 같은걸로 켜져 있거나, 함수가 인라인 처리되면서 빌드 시 특정 코드가 아예 지워져버리는 일이 생긴다면 어떻게 파악할까요? 그걸 확인하기 위한 유일한 방법은 어셈블리 코드를 보는 수 밖에 없을 것입니다. C++ 코드만 본다고 해서 만사가 해결될 일은 아닌 것이죠. 그러기 위해선 어셈블리 코드 한줄 한줄의 의미를 알아야만 합니다. 서버학원장님의 어셈블리어 꾸준히 보라는 말씀이 와닿았습니다.

아직 저는 어셈블리를 마스터 한 것은 아닙니다. 포큐에서 어셈블리 실습/과제를 했음에도 불구하고, 구경만 했지 사용하지 않은 명령어들(FPU, SIMD)도 허다합니다. 새로운 명령어들은 마주칠 때마다 무엇인지 관심있게 매뉴얼 뒤져서 알아보고 정리해야 할 것입니다.

### 아직은 그저 취미입니다

어셈블리어와 관련은 그다지 없지만, 종종 재미로 특정 파일의 헤더들을 가볍게 탐색해보곤 합니다.

![](https://raw.githubusercontent.com/jubin-park/blog.jubinpark.com/refs/heads/main/post/2026/04/25/assets//exif_header.png)

- 최근에 JPG 사진 파일에 EXIF(Exchangeable Image File Format)라는 메타데이터 헤더의 유무를 비교해보곤 했습니다. 자세히 알아본 건 아니지만, 첫 헤더에 **Exif** 라는 마크 스트링이 들어가고 그 뒤에는 알 수 없는 데이터들과 일부 날짜 문자열이 들어가는 데이터들을 확인했습니다.

![](https://raw.githubusercontent.com/jubin-park/blog.jubinpark.com/refs/heads/main/post/2026/04/25/assets//imhex.png)

- [이전에 쓴 포스트](https://www.jubinpark.com/2025/06/jsf.html)에 올리기도 했지만, 자체 포맷의 경우 (ex: 오래된 게임 리소스 파일), 헤더를 하나씩 제 나름대로 추측하면서 리소스를 추출하는 작업을 했었습니다. 완전하게 해석은 못하지만, 일부라도 리소스 파일의 구조가 어떻게 되는지 보면서 소소한 궁금증을 해결하기도 합니다.

- [루비 언어의 마샬링(직렬화) 파일 파서 프로그램 ](https://github.com/rubymaro/rgss_rxdata_parser/blob/main/rgss_rxdata_parser/Main.cpp)개발을 진행한 것도 있었습니다. 해당 바이너리를 읽어서 C++ 클래스로 역직렬화하는 실험적인 프로젝트였죠.

### 마치며

어셈블리어. 사람마다 느끼는 난도는 다르겠지만, 저에겐 결코 쉽다고 할 수 없는 과목이었습니다. 1번째 수강 때 회사 다니면서 수강했던 시절을 떠올리면, 시간상으로 그리고 능력상으로 벅찼던 것은 확실합니다. 그나마 지금 백수일 때 도전하니 가능했던 것으로 보고 있습니다.

팁을 공유할게요. 스택에 인자를 push/pop할 때의 스택의 상태를 그림으로 그렸는데 이게 무척 도움이 됐습니다. 공책에 그려도 되는데, 저의 경우 소스코드 파일에 주석으로 아스키 아트 하듯이 스택의 그림을 그렸습니다. 머리속으로 시각화하는 게 헷갈리다면 이 방법을 꼭 사용하길 권해드립니다.

다른 팁을 또 드리자면, [HxD](https://mh-nexus.de/en/hxd/) 프로그램 외에도 [ImHex](https://imhex.werwolv.net/) 라는 오픈소스 툴도 사용할 만 합니다.

이만 글을 마칩니다.

---
### 다른 후기
- [COMP3200: C++ 언매니지드 프로그래밍](https://blog.naver.com/jubin-park/221614304715) 
- [COMP1000: 소프트웨어 공학용 수학](https://blog.naver.com/jubin-park/221912073980)
- [COMP2500: 개체지향 프로그래밍 및 설계 (Java)](https://blog.naver.com/jubin-park/222061871416)
- [COMP2200: C 언매니지드 프로그래밍](https://blog.naver.com/jubin-park/222187427716)

댓글

댓글 쓰기