modesta.log
로그인
modesta.log
로그인
혼자 공부하는 컴퓨터구조 + 운영체제 Section 3. 명령어
jihyelee
·
2023년 7월 7일
팔로우
0
운영체제
컴퓨터구조
0
achitecture-os
목록 보기
3/15
강의 링크
소스 코드와 명령어
고급 언어
개발자가 이해하기 쉽게 만든 언어
e.g. 파이썬, C++, ...
저급 언어로 변환되어 실행
컴파일 언어
고급 언어 (소스 코드) -> 컴파일러로 컴파일 -> 저급 언어 (목적 코드)
컴파일 언어로 작성된 소스 코드는 컴파일러에서 저급 언어로 변환, 컴파일의 결과로 목적 코드가 생성
소스 코드 컴파일 중 오류가 발생하면 소스 코드 전체가 실행되지 않음
인터프리트 언어
인터프리터에 의해 한 줄씩 실행
소스 코드 전체가 저급 언어로 변환되기까지 기다릴 필요가 없음
소스 코드 인터프리트 중 오류가 발생하면 오류 발생 전까지의 코드는 실행
저급 언어
컴퓨터가 이해하고 실행하는 언어 (=명령어)
기계어
0과 1로 이루어진 명령어로 구성된 저급 언어
어셈블리어
0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어
e.g. 0101 0101 -> push rbp
명령어의 구조
무엇을 대상으로, 무엇을 수행하라
연산코드
수행할 연산
4가지 종류 (연산코드의 종류, 생김새는 CPU마다 다름)
데이터 전송: 데이터 옮기기, 메모리에 저장, 메모리에서 CPU로 데이터 전송, 스택에 데이터 저장, 스택의 최상단 데이터 옮기기 등
산술/논리 연산: 사칙연산, 논리연산(and, or, not), 오퍼랜드에 1 더하거나 빼기, 두 개의 숫자 혹은 true/false 비교 등
제어 흐름 변경: (조건에 부합할 때, 돌아올 주소를 저장한 채) 특정 주소로 실행 순서 옮기기, 프로그램 실행 중지, 저장했던 주소로 복귀 등
입출력 제어: 읽기, 쓰기, 입출력 장치 시작, 입출력 장치 상태 확인 등
오퍼랜드
연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치 (주소 필드)
없거나 하나 이상일 수도 있음
명령어 주소 지정 방식
16비트가 주어졌을 때 연산코드가 4비트라고 한다면
오퍼랜드 2개일 때, 2-주소 명령어에서 표현할 수 있는 데이터의 크기 = 2^6비트 (64비트)
오퍼랜드 3개일 때, 3-주소 명령어에서 표현할 수 있는 데이터의 크기 = 2^4비트 (16비트)
데이터가 아니라 데이터가 저장된 주소를 저장한다면
오퍼랜드 필드로 표현할 수 있는 데이터의 크기는 2^16비트가 됨
유효 주소 (effective address)
연산에 사용할 데이터가 저장된 위치
명령어 주소 지정 방식 (addressing modes)
연산에 사용할 데이터가 저장된 위치를 찾는 방법
유효 주소를 찾는 방법
다양한 명령어 주소 지정 방식들
즉시 주소 지정 방식
(immediate addressing mode)
연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
가장 간단한 형태의 주소 지정 방식
연산에 사용할 데이터의 크기가 작아질 수 있지만 빠름
연산 코드 + 연산에 사용할 데이터 형태
직접 주소 지정 방식
(direct addressing mode)
오퍼랜드 필드에 유효 주소 직접적으로 명시
유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦
연산 코드 + 유효 주소 형태 (연산에 사용할 데이터는 메모리 내에)
간접 주소 지정 방식
(indirect addressing mode)
오퍼랜드 필드에 유효 주소의 주소를 명시
앞선 주소 지정 방식들에 비해 속도가 느림
c.f. CPU가 메모리를 접근하는 속도는 느린 편이기 때문에 이를 최소화하는 게 속도에 좋음
연산 코드 + 유효 주소의 주소 형태 (연산에 사용할 데이터, 유효 주소는 메모리 내에)
레지스터 주소 지정 방식
(register addressing mode)
연산에 사용할 데이터가 저장된 레지스터 명시
메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름 (직접 주소 방식보다 빠를 수 있음)
연산 코드 + 유효 주소의 형태 (연산에 사용할 데이터는 레지스터 내에)
레지스터 간접 주소 지정 방식
(register indirect addressing mode)
연산에 사용할 데이터를 메모리에 저장
그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
연산 코드 + 유효 주소를 저장한 레지스터 형태 (유효주소는 레지스터 내에, 연산에 사용할 데이터는 메모리 내에)
C언어의 컴파일 과정
전처리기 (preprocessor)
input: test.c
output: test.i
gcc -E test.c -o test.i
본격적으로 컴파일하기 전에 처리할 작업들
외부에 선언된 다양한 소스 코드, 라이브러리 포함 (e.g. #include)
프로그래밍의 편의를 위해 작성된 매크로 변환 (e.g. #define)
컴파일할 영역 명시 (e.g. #if, #ifdef, ...)
컴파일러 (compiler)
input: test.i
output: test.s
gcc -S test.i(or test.c) -o test.s
전처리가 완료되어도 여전히 소스 코드
전처리 완료된 소스 코드를 저급 언어(어셈블리 언어)로 변환
어셈블러 (assembler)
input: test.s
output: test.o
gcc -o test.o test.s
어셈블리어를 기계어로 변환
목적 코드(object file)를 포함하는 목적 파일이 됨
목적 파일 vs. 실행 파일
목적 파일과 실행 파일은 둘 다 기계어로 이루어진 파일이나 다름
목적 파일은 링킹(linking)을 거친 이후에야 실행 파일이 됨
링커 (linker)
input: test.o
output: test.exe
jihyelee
Graduate student at Seoul National University, majoring in Artificial Intelligence (NLP). Currently AI Researcher at LG CNS AI Lab
팔로우
이전 포스트
혼자 공부하는 컴퓨터구조 + 운영체제 Section 2. 데이터
다음 포스트
혼자 공부하는 컴퓨터 구조 + 운영체제 Section 4. CPU의 작동 원리
0개의 댓글
댓글 작성