운영체제 수업 정리 - 2

박경현·2022년 10월 12일
0

항상 맥북 메모장에 정리만 하고 여기에는 바로 바로 안적어서 ㅋㅋ
바로바로 옮겨 적는 작업을 습관화 해야겠다 ㅋㅋㅋ

명령어 구조와 주소 지정 방식

고급언어에서 저급언어로 변환 되어야 컴퓨터가 이해

저급언어

기계어
	0과 1로 이루어진 언어

어셈블리어
	저수준의 언어

고급 언어에서저급으로 가는 법

컴파일 과정
	소스코드 => 컴파일러 => 목적코드(저급언어)
	소스코드 중간에 오류 있으면 소스코드 전체가 실행 안됨
	cpu나 컴파일러에 따라서 컴파일러 방식이 조금 달라짐
	ex) C, C++, JAVA

인터프리터
	인터프리터에 의해 한줄 씩 실행
	소스코드 전체가 저급 언어가 될때 까지 기다릴 필요가 없다
	소스코드 오류 있으면 그전까지는 실행
    ex) JS, Python

명령어의 구조 - 무엇을 대상으로,수행하라

연산코드 와 오퍼랜드로 이루어짐
-> ex) 더해라 / 120

오퍼랜드

연산에 사용될 데이터 or 데이터의 저장 위치(이게 거의 대부분임)
오퍼랜드 필드 == 주소 필드

	왜 위치를 적는 이유 => 데이터 크기의 제한 때문!,
		 오퍼랜드가 많을 수록 각각의 오퍼랜드가 차지하는 부분 적어진다

	ex) 2의 4승 정도 크기만 있다면 16개의 주소를 적어줄 수 있다
		
	유효 주소(effective address)
		연산에 사용할 데이터가 저장된 위치	
		

연산코드 - 수행할 연산

	데이터전송, 산술/논리 연산 , 제여흐름 변경, 입출력 제어
	
	ex) 데이터 전송 -> MOVE, STORE(메모리에 저장), PUSH(스택에 저장), LOAD(메모리에서 cpu로)
	eX) 산술 논리 연산 -> ADD/ SUBTRACT / AND
	ex) 제어 흐름 변경 -> JUMP(특정 주소로 실행 순서를 옮겨라), HALT(실행 멈추기)
	ex) 입출력제어 -> READ/ WRITE
	

명령어 주소 지정 방식

유효 주소 찾는방법! 즉 데이터가 저장된 위치를 찾는 방법

이건 메모리 주소 지정 방식

즉시 주소 지정 방식 - 데이터를 오퍼랜드에 직적 명시, 삐름, 용량 제한
(레지스터나 메모리 안쓰긴 함)

직접 주소 방식 - 오퍼랜드 필드에 직접 유효 주소 적는 방법 (ㅇ효 주소를 표현하는 크기가 연산코드만큼 줄어듦)

간접 주소 지정 방식 - 유효주소의 주소를 명시! , 속도는 느림

레지스터 주소 지정 방식 - 연산에 사용할 데이터가 저장된 레지스터 명시
속도 매우 빠름!

레지스터 간접 주소 지정 방식 - 연산에 사용할 데이터를 메모리에 저장, 주소를 레지스터에,
이 주소를 오퍼랜드에 명시!

C 언어 컴파일 과정

전처리기 -> 컴파일러 -> 어셈블러 -> 링킹

전처리기
=> 전처리라는 과정을 통해 .i라는 확장자로 변환되서 나옴
준비작업이라고 생각하면 편함, 외부에 선언된 소스코드, 라이브러리 포함

gcc -E <폴더위치> 하면 전처리 완료된 소스코드를 얻을 수 있다!!

#include<stdio.h> -> 이걸 진짜 가져오는 과정이 전처리기 임!
int main() { printf(“hello”); return 0; }

컴파일러
.s라는 파일로 변환해 줌
전처리 완료 되도 여전히 소스코드 -> 저급언어로 변환해줌(어셈블리어)

gcc -S <폴더위치> 하면 컴파일 된 코드가 나옴!

어셈블러
어셈블리어를 기계어로 변환!
목적코드를 포함하는 목적 파일이 됨!

gcc -o <폴더 위치> 하면 나옴
0 과 1로 이루어져있다!

링킹
각기 다른 목적파일을 하나의 목적파일로 묶는 작업!

목적파일 vs 실행 파일
	목적파일은 링킹을 거친 후에 실행 파일이 된다!
profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글