본 정리는 CS422-컴퓨터 구조 및 설계 : 하드웨어/소프트웨어 인터페이스. David A. Patterson, 존 헤네시 책을 바탕으로 하고 있음을 미리 알립니다.
오류 및 함정
(여기서 부르는 함정은 흔히들 하는 실수이고, 오류는 많은 사람들이 공통적으로 잘못 알고 있는 부분이다.)
오류 : 강력한 명령어를 사용하면 성능이 좋아진다.
강력한 명령어를 사용하면 더 적은 명령어들이 필요하게 된다.
그러나 복잡한 명령어는 속도가 느리고 이는 단순한 명령어들까지 속도를 느리게 만든다.
컴파일러들은 단순한 명령어들로부터 빠른 코드를 만들기에 좋다.
오류 : 최고 성능을 얻기 위해 어셈블리 언어로 프로그램 작성하기.
과거에는 컴파일러의 성능이 좋지 않았지만, 컴파일러 기술의 발달로 어셈블리 언어로 작성한 프로그램과 컴파일한 어셈블리 프로그램 간의 성능 차이가 거의 나지 않는다.
또, 한번 장성되면 누군가가 계속 고쳐서 유지보수해야하는데 이에 어셈블리 언어는 적합하지 못하다. (매우 길고 복잡하므로)
오류 : 상업용 프로그램의 이진 호환성이 중요하다는 것은 성공적인 명령어 집합은 변하지 않는다는 것을 의미한다.
후방 이진호환성은 신성불가침이지만, 명령어 집합은 꾸준히 증가하고 있다.
함정 : 바이트 주소를 사용하는 컴퓨터에서 인접 워드 간의 주소 차이가 1이 아니라는 사실을 잊는 것.
많은 어셈블리 프로그래머들이 주소를 하나 증가시키면 다음 워드를 찾을 수 있다고 생각했다가, 이로 인해 생긴 오류로 심한 고생을 겪었다.
함정 : 자동 변수가 정의된 프로시저 외부에서 자동 변수에 대한 포인터를 가용하는 것.
지역 배열이 저장된 메모리 영역은 프로시저가 종료되자마자 스택에서 사라져 다른 용도로 재사용되므로, 이미 없어진 지역 변수에 대한 포인터를 사용하면 예기치 못한 일이 발생할 수도 있다.
결론
내장 프로그램 컴퓨터의 두 가지 기본 원리
- 숫자와 같은 형태의 명령어를 사용한다
- 변경 가능한 메모리에 프로그램을 저장한다.
이 두 원리 덕에 컴퓨터 하나로 과학자는 과학자대로 금융가는 금융가대로 자기가 필요한 일을 처리할 수 있는 것이다.
명령어 집합의 선택은 프로그램 실행에 필요한 명령어 개수와 명령어 한 개의 실행에 필요한 클럭 사이클 수, 그리고 클럭 속도 간의 미묘한 균형을 요하는 문제이다. 명령어 집합 설계자가 이런 미묘한 결정을 내릴 때 지침이 될 수 있는 설계 원칙 4가지는 다음과 같다.
- 간단하게 하기 위해서는 규칙적인 것이 좋다.
- 작은 것이 더 빠르다
- 좋은 설계에는 적당한 절충안이 필요하다
- 저주 생기는 일을 더 빠르게 하라
우리가 작성하는 언어(High Level Language)는 컴파일러에 의해 어셈블리 프로그램 혹은 어셈블리어가 되고 이는 어셈블러에 의해 기계어로 된다.
컴파일러에 의해 어셈블리어가 되는 과정은 컴파일러에 의해 같은 기능을 하지만 다양한 어셈블리어가 나올 수 있고, 이는 어셈블리어의 효율을 높이는 방향으로 되어야 한다.
어셈블러는 어셈블리 프로그램을 기계가 이해할 수 있는 이진수(기계어)로 번역하고, 때로는 하드웨어에 없는 명령을 추가하여 명령어 집합을 확장하기도 한다.
즉, 각 어셈블리어의 명령어 종류는 다음과 같이 상위 수준 언어의 구조나 문장과 연관 지을 수 있다.
- 산술 명령어는 치환문에 나타나는 연산에 해당한다.
- 데이터 전송 명령어는 배열이나 구조체 같은 자료구조를 다룰 때 쓰인다.
- 조건부 분기는 if문과 순환문에서 사용된다.
- 무조건 점프는 프로시저 호출과 복귀 및 case/swith 문에서 사용된다.