포인터(pointer)(1)
본 글은 Do it! C언어 입문 책을 기반으로 작성하였습니다.
- 프로그래밍 언어의 기계어 변환 과정(C언어 기반)
.cpp -> 전처리 -> .i -> 컴파일 -> .s -> 어셈블링 -> .o -> 링킹 -> .exe(실행파일)
프로그래밍 코드 -> 컴파일러 -> 어셈블리어 -> 어셈블러 -> 기계어(binary) -> 링크 -> 실행파일
- 운영체제의 메모리 관리 방식
- 직접 주소 지정 방식 : 만약 1042를 2바이트 크기로 저장한다고 하면 한 바이트에 4, 나머지 바이트에 18을 저장한다. 리틀엔디안, 빅엔디안에 따라서 저장위치가 달라지겠지만 한 바이트는 8비트이기 때문에 1042를 2진수로 나타내면 0000 0100 0001 0010 이다. 해당 비트를 8비트씩 끊어서 저장하게 되는 형식이다.
- 사람은 10진수를 사용하기 때문에 바이트 단위로 나누기가 힘들다. 따라서 2진수로 변환하는 것이 16진수로 변환하는 것보다 효율적이지 않다.
- 간접 주소 지정 방식 : pointer를 사용하여 memory의 다른 공간으로의 주소를 가리킨다. 이렇게 하면 명령어 자체를 바꿔서 값을 바꾸는 형식이 아니라 pointer가 가리키는 곳만 바꾸면 되기 때문에 명령어를 바꿀 필요가 없다.
그렇다면 직접 주소 지정 방식과 간접 주소 지정 방식의 장단점은?
장점 :
- 명령어 형식이 간단하고, 데이터 인출을 위해 오퍼랜드에 저장된 해당 주소의 기억장치를 한번만 액세스한다. 즉, 빠르다.
단점 :
- 주소공간이 제한되어 많은 수의 주소를 지정할 수 없다.
- 연산 코드를 제외하고 남은 비트들이 주소 비트로 사용되기 때문에 지정할 수 있는 기억장소의 수가 제한된다.
예시로는 아래를 참고한다.
예시) 16비트의 명령어 중에서 연산코드 길이가 4비트인 경우, 오퍼랜드 필드의 길이는 16-4 = 12비트이므로,
직접 주소지정 방식을 통하여 지정할 수 있는 메모리의 크기는 2^12 = 4096개이다. 이를 통해 2^16개 만큼의 메모리를 모두 사용할 수 없는 단점이 생기게 된다. 만약 2^12보다 큰 크기의 데이터가 올 때 수행이 알 될 수 있다.
장점 :
- CPU가 한 번에 접근할 수 있는 단어의 길이(워드)에 의해 최대 기억장치 용량이 결정된다. 즉, 2^n 만큼의 주소 공간을 활용할 수 있다.
- 기억장치의 구조 변경 등이 용이하다. 위에서 설명한 바와 같이 명령어를 바꿀 필요가 없어진다.(가리키는 곳만 바꾸면 되니까)
- 긴 주소에 접근이 가능하다. 위의 직접 지정 주소 방식과는 반대로 긴 길이의 데이터도 접근 가능하다.
단점 :
- 한번의 실행 사이클 동안 두 번의 기억장치 액세스가 필요하다. 주소를 찾아내서 그 해당 주소의 데이터로 다시 접근해야하기 때문이다.
이를 토대로 pointer의 필요성에 대해 생각해 보았고 다음은 포인터가 무엇인지에 대해서 살펴보겠다.
Continue...
출처 : https://jeongminhee99.tistory.com/48
week3(1) - 명령어를 효과적으로 실행하기 위한 기법
1. 주소 지정 방식 - 주소 : 주기억장치에서 데이터가 저장된 위치 - 주소 지정 방식(addressing mode) : 주소를 지정하는 방식 - 유효주소 (Effective Address) : 데이터가 저장된 기억장치의 실제주소를 유
jeongminhee99.tistory.com