소스코드와 명령어
고급언어
- 개발자가 이해하기 쉽게 만든 언어 (프로그래밍언어)
- 컴파일 언어, 인터프리터 언어
컴파일 언어
- 컴파일을 통해 저급언어로 변환
- 컴파일러에 의해 저급언어로 변환 (처음부터 끝까지 다 보고 변환) -> 컴파일
- 컴파일의 결과로 저급언어인 목적코드(Object Code) 생성
- 컴파일 중 오류 발생하면 소스코드 전체 실행 안됨
인터프리터 언어
- 인터프리트를 통해 저급언어로 변환
- 인터프리터에 의해 한줄씩 실행
- 소스코드 전체가 저급언어로 변환되기까지 기다릴 필요없음
- 소스코드 인터프리트 중 오류 발생하면 오류 발생 전까지의 코드는 실행
위 두가지 방식만 있는 것이 아닌 많은 방식이 있지만 대표적인 방식이 컴파일 방식과 인터프리트 방식
저급언어
- 컴퓨터가 이해하고 실행하는 언어 (명령어)
- 기계어, 어셈블리어
기계어
- 0과 1로 표현 (이진수로 이루어진 명령어)
- 십육진로도도 표현
어셈블리어
- 0과 1로 이루어진 기계어를 읽기 편한 형태로 변역
- 소스코드에 명시하며 개발하기도 함
명령어의 구조
명령어의 구조
- 오퍼랜드
- 무엇을 대상으로??
- 연산에 사용될 데이터 or 연산에 사용될 데이터가 저장된 위치
- 연산 코드
오퍼랜드
- 연산에 사용될 데이터 또는 연산에 사용될 데이터가 저장된 위치
- 사용될 데이터가 저장된 위치를 더 자주 저장하고 사용함
- 사용될 데이터가 저장된 위치 == 주소필드
- 명령어에서 표현할 수 있는 데이터 크기가 제한 되기 때문에 더 자주 사용
- 그래서 메모리 주소나 레지스터 등의 주소를 적어 표현할 수있는 데이터 크기를 키우는 것
- 없는 경우도 있고, 하나 이상인 경우도 있음
연산코드
- 수행할 연산
- CPU마다 다 다름
- 연산코드 종류
- 데이터 전송 : 옮겨라, 저장해라, 가져와라 ...
- 산술 / 논리 연산 : 더해라, 빼라, 비교해라 ...
- 제어 흐름 변경 : 순서 옮겨라, 돌아가라, 멈춰라 ...
- 입출력 제어 : 읽어라, 써라, 시작해라, 확인해라 ...
명령어 주소 지정방식
- 유효주소 (effective address)
연산에 사용될 데이터가 저장된 위치
- 명령어 주소 지정 방식 (addressing modes)
- CPU가 연산에 사용할 데이터 저장 위치 찾는 방법
- 유효 주소 찾는 방법
- 다양한 명령어 주소 지정 방식들이 있음
메모리에 저장
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
- 가장 간단한 형태의 주소 지정 방식
- 연산에 사용할 데이터 크기가 작아질 수 있지만, 속도 빠름
직접 주소 지정 방식 (direct addressing mode)
- 오퍼랜드 필드에 유효 주소 직접적으로 명시
- 즉, 유효주소를 찾아갔더니 사용될 데이터 있음
- 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦
간접 주소 지정 방식 (indirect addressing mode) - 메모리에
- 오퍼랜드 필드에 유효 주소의 주소 명시
- 앞선 주소 지정 방식들에 비해 속도 느림
레지스터에 저장
레지스터 주소 지정 방식 (register addressing mode)
- 연산에 사용될 데이터가 저장된 레지스터 명시
- 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름
레지스터 간접 주소 지정 방식 (register indrect addressing mode)
- 연산에 사용될 데이터를 메모리에 저장
- 그 주소를 저장한 레지스터를 명시
메모리는 CPU 밖에 있고, 레지스터는 CPU 안에 있기 때문에 레지스터에 저장하는 것의 속도가 빠르다.
스택
큐
인프런 강의