어셈블리어 프로그래밍
Great 프로그래머의 필수템, 어셈블리어를 마스터하세요. 이 강좌는 다양한 환경에서 어셈블리어를 자유롭게 구사할 수 있는 능력을 길러줍니다. 심지어 컴퓨터를 직접 제작하는 경험까지 포함되어 있죠! POCU 아카데미의 독창적이고 철저한 커리큘럼을 통해 하드웨어의 본질을 깊이 이해하고, 기초 컴퓨터 구조와운영체제의 세계를 완벽하게 습득하세요!
배울 내용
- x86 어셈블리어 (16, 32 ,64 비트)
- 6502 어셈블리어
- CPU처럼 생각하는 법
- 간단한 컴퓨터 제작 방법
- 컴퓨터 구조 기초 (CPU)
- 운영체제와 BIOS의 역할
요구 사항
- 'C 언매니지드 프로그래밍' 수료
- 기초 자료 구조를 직접 구현할 수 있음
- 포인터를 확실히 이해하고 사용할 수 있음
- 문법에 발목 잡히는 일이 없을 정도로 프로그래밍에 능숙
- 비트패턴을 자유자재로 다룰 수 있음
- 진법 변환을 자유자재로 할 수 있음
- C 표준 라이브러리의 문자열 함수를 다 구현할 수 있음
- 스택 메모리의 동작법을 확실히 이해하고 있음
설명
본 비디오 강좌는 POCU 아카데미에서 진행하는 COMP2300 수업의 비디오 강좌입니다.
Great 프로그래머가 되려면 프로그램을 구성하는 가장 낮은 수준부터 가장 높은 수준까지 완벽하게 이해해야 합니다. 이를 통해 저수준과 고수준 사이의 어딘가에서 올바른 결정을 내려 미래에나 가능해 보이는 일을 지금 당장 이뤄낼 수 있으며, 그런 능력을 갖춘 사람이 바로 Great 프로그래머거든요. 하지만 시중에는 고수준 프로그래밍에 관한 강의가 넘쳐나는 반면, 저수준 프로그래밍에 대한 강의는 매우 부족한 상황입니다. 이를 해결하기 위해 POCU 아카데미가 차별화된 저수준 프로그래밍 강좌, 'COMP2300: 어셈블리 프로그래밍'을 선보입니다.
컴퓨터는 딱 한 가지 언어만 이해할 수 있습니다. 기계어, 즉 0과 1로 이루어진 이진수입니다. 마법처럼 보이는 어떤 언어와 도구를 사용하든 간에 그 도구가 하는 일은 결국 기계어를 만들어내는 것이며, 컴퓨터는 그 기계어를 해석해서 실행할 뿐입니다. 따라서 컴퓨터의 동작원리를 이해하기에 기계어를 공부하는 것만큼 좋은 방법이 없죠. 하지만 기계어는 사람이 쉽게 읽을 수 없습니다. 따라서 각 기계어 명령어마다 별칭을 단 언어인 어셈블리어를 그 대신 배우곤 합니다.
본 강좌는 간단히 CPU 구조를 살펴본 뒤, 크게 다음과 같은 순서에 따라 진행됩니다.
1. 8 비트 어셈블리 프로그래밍 (+컴퓨터 제작)
2. 16 비트 어셈블리 프로그래밍 (+운영체제 서비스)
3. 32/64 비트 인라인 어셈블리 프로그래밍 (+SIMD)
'Part 1: 8 비트 어셈블리 프로그래밍'에서는 MOS 6502 CPU를 사용해 기초적인 8 비트 컴퓨터를 제작하고, 그 컴퓨터에서 동작하는 기계어 및 어셈블리어 코드를 작성합니다. 이 부분에서는 CPU의 구조와 동작원리를 이해하고, 어셈블리어를 활용해 하드웨어를 직접 제어하는 제어기기 프로그래밍 패턴을 배울 수 있습니다.
'Part 2: 16 비트 어셈블리 프로그래밍'에서는 현재 데스크톱 CPU 점유율 1위인 x86 계열 CPU의 시초인 Intel 8086/8088 CPU에서 x86-16 어셈블리어 코드를 작성합니다. 이 부분에서는 많은 프로그램에 공통적인 연산(예: 콘솔 출력)을 운영체제의 도움을 받아 처리하는 법을 배우며, 이는 시스템 프로그래밍 패턴을 익히는 좋은 계기가 될 것입니다.
'Part 3: 32/64비트 인라인 어셈블리 프로그래밍'에서는 고수준 언어인 C에서 성능에 중요한 일부 코드만 어셈블리어로 작성하는 인라인 어셈블리 프로그래밍 패턴에 대해 배워봅니다. 또한 한 번의 명령으로 다수의 데이터를 한 번에 처리하는 SIMD(Single Instruction Multiple Data)에 대한 지식도 함께 습득하게 됩니다.
이 과목의 목표는 어셈블리어를 화려하게 구사하는 것이 아닙니다. 이 과목을 성공적으로 끝마친 학생이 기대할 수 있는 효과는 다음과 같습니다.
1. 프로그래밍의 근본적인 구조와 원리를 깊이 이해하며, 저수준 프로그래밍을 통해 고수준 프로그래밍의 효율성과 높은 수준의 성과를 이끌어 낼 수 있는 Great 프로그래머로 거듭날 것입니다.
2. 기존에 알고 있던 프로그래밍 언어와 개념에 대한 이해가 더욱 깊어질 것입니다. 특히 어셈블리어를 배우는 것은 최적화된 코드를 작성하는 데 큰 도움이 되며, 높은 수준의 언어와 저수준의 언어 사이에서 발생하는 성능 상의 이슈를 파악하고 해결할 수 있는 능력을 기를 수 있습니다.
3. 향후에 다양한 플랫폼과 환경에서 동작하는 프로그램을 개발하고 최적화할 때 중요한 역할을 하는 저수준 프로그래밍에 대한 실질적인 이해를 갖추게 될 것입니다. 이는 더욱 전문적이고 성공적인 프로그래머로 성장하는 데 필수적인 역량입니다.
4. 이 과목에서 얻은 지식과 경험을 바탕으로 프로젝트를 구성하고 관리하는 데 있어 보다 합리적이고 전략적인 결정을 내릴 수 있게 될 것입니다. 이로 인해 프로젝트의 효율성과 성공률이 크게 향상되는 것은 물론, 속한 조직이나 개인적인 경력에서도 큰 도약을 이룰 것입니다.
POCU 아카데미의 독창적이고 철저한 커리큘럼을 통해 하드웨어의 본질을 깊이 이해하고, 기초 컴퓨터 구조 및 운영체제의 세계를 완벽하게 습득하세요. 지금 바로 POCU 아카데미의 어셈블리어 강좌를 통해 프로그래머로서 한 단계 더 도약할 수 있습니다. 저수준 프로그래밍의 흥미로운 세계로 함께 떠나 볼 준비가 되셨나요? 지금 바로 참여하세요!
이 강좌의 대상
- 컴퓨터 공학의 기본기를 배우고 싶은 분들
- 프로그래머로서 평생 커리어를 꿈꾸는 분들
- Great 프로그래머를 꿈꾸는 분
강좌 콘텐츠
- 훌륭한 프로그래머와 어셈블리어 (2:06)
- 이 과목에서 사용하는 서비스 및 도구 (4:43)
- 강의 시청 및 노트 정리 (3:45)
- 중요 정보 (3:36)
- 실습과 과제 진행하기 (6:45)
- 부정행위 금지와 코딩표준 (3:07)
- 질문하는 법 (3:08)
- 선수 과목과 슬라이드 표기법 (5:43)
- 어셈블리어를 배워야 하는 이유 (3:53)
- 업계 불문 하드웨어에 대한 이해는 필수 (6:40)
- 팩트 체크: 어셈블리어는 얼마나 사용하나? (9:28)
- 어셈블리어와 비슷한 개념과 실제 경험 (10:25)
- 어셈블리어 학습이 쉬운 이유 (2:47)
- 수업 일정 (4:05)
- 언매니지드 언어의 중요성 (3:48)
- Great 프로그래머가 되려는 사람을 위한 조언 (9:03)
- 어셈블리어와 컴퓨터 구조 공부 (4:45)
- 아날로그 신호의 저장과 재생 (9:59)
- 복습 퀴즈
- 데이터의 디지털 저장법 (9:27)
- 동작의 디지털 저장법 (1:36)
- 트랜지스터 (4:04)
- 트랜지스터와 논리 연산 (7:41)
- 논리 게이트 (6:53)
- 복습 퀴즈
- 논리 게이트와 산술 연산 (6:49)
- ALU (8:05)
- 어셈블리어 프로그래밍은 소프트웨어 작성 (7:15)
- 튜링 기계 (7:29)
- 튜링 기계와 하드웨어 (7:27)
- 범용 튜링 기계와 소프트웨어 (6:11)
- 튜링 완전 (2:45)
- 복습 퀴즈 1
- 복습 퀴즈 2
- 폰 노이만 구조 (7:09)
- 명령어 사이클 (5:00)
- 연산자 디코딩 예 (5:56)
- 현대 CPU의 컴퓨팅 추상화 계층 (5:41)
- 복습 퀴즈
- 정리 (3:38)
- 기계어 프로그래밍이란? (1:50)
- 6502 CPU 소개 (4:52)
- 6502를 사용하는 이유 (7:07)
- 프로그램 실행 패턴 (5:50)
- 65C02의 핀 구성 (6:46)
- 브레드보드 준비하기 (9:34)
- CPU 설치하기 (4:27)
- 클럭 및 기타 선 연결하기 (8:15)
- 복습 퀴즈
- CPU 상태 확인하기 (5:24)
- CPU 리셋하기 (4:27)
- 클럭 속도 늦추기 (6:01)
- 스파이더 연결하기 (7:37)
- 핀 값 읽는 프로그램 작성하기 (8:51)
- 리셋 벡터 (2:49)
- 복습 퀴즈
- ROM 주소 매핑 (7:54)
- ROM 설치하기 (4:56)
- 복습 퀴즈
- OE, CE, WE (4:35)
- 복습 퀴즈
- 프로그램을 ROM에 플래시 하기 (6:08)
- 디스어셈블 (4:47)
- 간단한 덧셈 프로그램 (7:07)
- RAM 설치하기 (8:15)
- RAM 주소 매핑 (3:47)
- RAM 결과 확인하기 (2:16)
- 타이밍 다이어그램을 봐야 하는 이유 (3:21)
- CPU 주소 타이밍 다이어그램 (7:17)
- CPU 데이터 타이밍 다이어그램 (5:34)
- RAM 읽기 타이밍 다이어그램 1 (6:57)
- RAM 읽기 타이밍 다이어그램 2 (5:11)
- RAM을 클럭에 동기화시키기 (9:51)
- 논리 게이트 딜레이 계산하기 (2:35)
- RAM 쓰기 타이밍 다이어그램 (8:22)
- 마지막 확인 (5:53)
- ROM과 RAM의 분리 (6:39)
- 복습 퀴즈
- 정리 (2:33)
- 어셈블리어의 언어적 분류 (9:22)
- 어셈블리어와 헬로 월드 (2:04)
- 헬로 16 코드 작성 및 어셈블 (10:07)
- 헬로 16 바이너리 파일 생성 (7:46)
- 6502 명령어의 구성 (9:28)
- 6502의 주소지정 모드 (5:10)
- A 주소지정 모드 (6:33)
- A 모드의 사이클 수 세기 (3:47)
- CPU 파이프라인 (5:19)
- 올바른 A 모드의 사이클 수 세기 (7:25)
- 즉시 모드 (5:00)
- 즉시 모드 명령어 사이클 (5:29)
- 절대 주소 모드 (9:09)
- 영상 퀴즈
- zp 주소지정 모드 (4:30)
- 6502의 메모리 페이지 레이아웃 (4:00)
- 연산자 (5:20)
- 복습 퀴즈
- 실행 중 데이터의 저장 (5:14)
- 전역적인 데이터 저장 (2:59)
- 변수명과 가독성 (2:16)
- 스택 메모리 (7:44)
- 상수, 포인터 변수 (4:58)
- 데이터 블록 (7:09)
- 메인 레지스터 (4:43)
- X, Y 색인 레지스터 (1:59)
- S 레지스터 (5:43)
- 프로세서 상태 레지스터 (2:53)
- 프로그램 카운터 (1:21)
- 복습 퀴즈
- 묵시적 주소지정 모드와 nop (7:06)
- 프로그램 종료 (4:08)
- 정리 (4:39)
- 정수의 덧셈 (8:25)
- 영상 퀴즈
- 최상위 비트 받아올림의 처리 (8:06)
- 받아올림 플래그 C (3:37)
- 가산기와 비트 수 (6:17)
- 2배 정밀도 덧셈 (6:18)
- signed 정수의 덧셈 (4:37)
- 오버플로 플래그 V (8:14)
- 제로 플래그 Z, 음수 플래그 N (5:07)
- 코드보기: adc의 상태 플래그 (5:44)
- 복습 퀴즈
- 8비트 뺄셈 (7:21)
- 16비트 뺄셈 (6:36)
- 복습 퀴즈
- 증감 연산 (6:37)
- 색인 주소지정 모드 (5:37)
- 페이지 크로싱 (7:53)
- 코드보기: zp,x 래핑(wrapping) (1:56)
- 복습 퀴즈
- 증감 연산의 플래그 (2:17)
- 비트 이동 (7:56)
- 비트 회전 (4:10)
- 복습 퀴즈
- 코드보기: 비트 패턴 뒤집기 (4:34)
- 논리 연산 (6:32)
- 영상 퀴즈
- 곱셈, 나눗셈 (3:43)
- 복습 퀴즈
- 정수형 (5:14)
- 데이터 형의 해석 주체 (8:24)
- 실수형 (3:07)
- 형 변환 (8:19)
- 정리 (2:22)
- 코드 재활용의 필요성 (8:34)
- 회귀주소 전달에 대한 고민 (5:07)
- 간접 참조 (7:13)
- 코드보기: 계산기 (룩업 테이블) (4:14)
- 코드보기: 계산기 (룩업 테이블 2) (2:07)
- zp 회귀주소의 문제 (4:55)
- 스택에 회귀주소 저장하기 (5:57)
- 함수 호출/반환 니모닉 (3:41)
- 함수 호출/반환 상세 동작표 (7:55)
- 복습 퀴즈
- zp를 이용한 인자 전달 (9:09)
- 스택을 통한 인자 전달 (8:19)
- 매개변수가 여럿 있는 경우 (8:07)
- 스택 원상복구 방법 (6:51)
- 복습 퀴즈 1
- 복습 퀴즈 2
- zp를 이용한 반환값 전달 (6:36)
- 스택을 통한 반환값 전달 (2:02)
- 레지스터를 통한 반환값 전달 (1:29)
- 워드 크기 이상의 반환값 전달 (2:53)
- 함수 호출 데이터 위치 베스트 프랙티스 (4:58)
- 함수 호출 오버헤드 (7:55)
- 예외적으로 함수가 허용되는 경우 (7:37)
- 문자열 복사 함수 (5:41)
- 6502의 간접 주소지정 모드 (5:25)
- (zp),y 주소지정 모드 (4:48)
- 스택을 사용한 문자열 복사 함수 (5:13)
- 코드보기: C#의 ref 키워드 흉내내기 (3:26)
- 256 초과 바이트 복사하기 (8:02)
- 코드보기: 두 배열 더하기 (2:23)
- 복습 퀴즈
- (zp,x) 주소지정 모드 (3:44)
- 문자열들의 총길이 구하기 (8:13)
- 간접 주소지정 모드와 성능 (1:17)
- 배열의 배열 (2:18)
- 스택에 문자열 복사하기 (4:28)
- 상태 레지스터 보존 (6:06)
- 함수 오버로딩, 기본값 인자, 함수 포인터 (4:08)
- 코드보기: 계산기 (함수 포인터 버전) (4:16)
- 정리 (6:07)
- x86 아키텍처 소개 (9:28)
- x86-16과 패러다임 변화 (7:51)
- 복습 퀴즈
- x86-16 개발환경 (5:50)
- 운영체제의 역할 (3:10)
- MS-DOS 부팅 순서 1~3 (8:44)
- MS-DOS 부팅 순서 4~6 (6:00)
- 셸에서 프로그래밍 실행 (3:27)
- 보호 모드 (8:16)
- Hello x86 (1) (6:56)
- Hello x86 (2) (9:01)
- 변수 및 초기화 (12:07)
- 8088의 레지스터 (11:41)
- 복습 퀴즈
- 피연산자 종류 (4:54)
- 비간접 피연산자 (6:58)
- 간접 피연산자 (6:55)
- 주소지정 모드하고의 차이 (5:53)
- x86-16 니모닉 소개 (3:40)
- 니모닉 표 읽는 법 (7:04)
- 데이터 전송 니모닉 (5:36)
- 데이터 크기 변환 니모닉 (1:32)
- 포인터 로드 니모닉 (2:17)
- 스택 사용 니모닉 (9:01)
- 포트 입출력 니모닉 (1:50)
- 산술 연산 니모닉 (7:58)
- 복습 퀴즈
- 논리 연산 니모닉 (1:05)
- 비트 이동/회전 니모닉 (2:49)
- 제어 니모닉 (6:44)
- 반복문 니모닉 (1:32)
- 코드보기: 1부터 N 더하기 (5:56)
- 코드보기: loop 없이 1부터 N 더하기 (2:10)
- 코드보기: 소수 판별 (5:03)
- 문자열 니모닉 (1:49)
- 기타 니모닉 (4:53)
- 정리 (3:26)
- 8086과 8087 (5:00)
- 일반적인 8087 사용법 (6:35)
- 복습 퀴즈
- 8087의 레지스터와 데이터 형 (5:30)
- Hello 제곱근 (2:07)
- 복습 퀴즈
- x87 니모닉과 피연산자 형태 (9:58)
- 실수/정수 전송 명령어 (7:58)
- 영상 퀴즈 1
- 영상 퀴즈 2
- 영상 퀴즈 3
- 영상 퀴즈 4
- 상수 로드, 제어데이터 전송 명령어 (1:30)
- 사칙 연산 명령어 (6:08)
- 기타 연산 명령어 (3:56)
- 비교 명령어 (7:04)
- x87 코프로세서의 발전 (5:19)
- 복습 퀴즈
- 코드보기: 원의 면적 구하기 (5:05)
- 코드보기: 3D 공간 변환 (14:53)
- 정리 (4:34)
- 컴파일러와 자동 벡터화 (8:44)
- SIMD의 필요성 (5:20)
- SSE의 발전과 하드웨어 지원 문제 (7:37)
- MMX부터 SSE까지 (7:41)
- AVX의 발전과 불확실한 미래 (9:14)
- 요즘 컴파일러와 SIMD 코드 (7:45)
- MMX 소개 (6:37)
- 이동, 덧셈, 뺄셈 (9:25)
- unpack (6:46)
- 논리 연산 (6:01)
- broadcast (4:35)
- 곱셈과 madd (4:56)
- 비트 이동 (7:29)
- pack (2:48)
- 비교 명령어 (5:29)
- reduce로 최댓값 찾기 (6:18)
- 셔플 (3:50)
- horizontal (6:21)
- SSE 명령어 1 (7:49)
- SSE 명령어 2 (6:45)
- SSE2, SSE3, SSE4 (6:58)
- SSE로 공간 변환하기 (7:59)
- AVX 프로그래밍 (3:46)
- gather, scatter (7:37)
- 복습 퀴즈
- 정리 (3:45)