마이크로프로세서 프로그래밍 기초
마이크로프로세서 프로그래밍 기초
마이크로프로세서의 명령어 세트는 각 칩마다 고유합니다. 예를 들어, 인텔 80386은 모토로라 68020과 다른 이진 인코딩을 사용하여, 동일한 연산에도 고유한 머신 코드가 필요합니다.
명령어 세트에 대한 보편적 표준이 없기 때문에, 저수준 프로그래밍은 칩별 깊은 지식을 요구합니다.
개발자가 CPU를 직접 제어하는 코드를 작성할 때(엔진 연료 분사 조정 등), 그는 프로세서의 네이티브 머신 언어로 프로그래밍합니다. 이는 CPU의 제어 장치가 디코딩하는 일련의 이진 비트입니다.
머신 언어는 기술적으로 이진이지만, 프로그래머는 가독성을 위해 거의 항상 16진수로 작성합니다. 인텔 8080의 몇 가지 일반적인 명령어는 다음과 같습니다:
16진수 이진수 명령어 설명
--------- -------- -----------------------------------------
7B 01111011 레지스터 A의 내용을 레지스터 E로 이동
87 10000111 레지스터 A의 내용을 레지스터 D에 더하기
1C 00011100 레지스터 E의 내용을 1 증가
D3 11010011 데이터 버스로 데이터 바이트 출력
16진수 표기법으로도 이 코드들은 혼란스러울 수 있습니다. 어셈블리 언어는 니모닉 약어를 제공합니다. 예: 7B가 MOV A,E가 되며, 이는 실행 전 어셈블러에 의해 이진으로 변환됩니다.
프로그램 작성 후 메모리에 로드해야 합니다. 비휘발성 저장을 위해 ROM 프로그래머가 이진 이미지를 ROM 칩에 쓰고, 휘발성 메모리의 경우 부트로더나 OS 루틴이 키스트로크나 디스크 파일을 받아 코드를 RAM에 배치합니다.
완전한 기능의 PC에서 컴파일러가 어셈블된 코드를 디스크 파일에 씁니다. 런타임에 파일 이름을 호출하면 CPU의 프로그램 카운터가 첫 번째 명령을 가리키고 프로그램이 실행됩니다.
머신이나 어셈블리 프로그래밍은 높은 효율의 코드를 생성하지만, 노동 집약적이고 오류 발생하기 쉽습니다. 고급 언어(C, C++, Java 등)는 개발자가 print "Hello, world!"처럼 의도를 표현하게 하여 개별 머신 단계를 상세히 기술하지 않게 합니다.
고급 프로그램은 컴파일러(정적 변환) 또는 인터프리터(런타임 변환)에 의해 머신 코드로 변환됩니다. 컴파일된 코드는 실행 중 변환이 없으므로 더 빠르고, 인터프리터 코드는 명령당 오버헤드가 발생합니다.
일반적인 컴파일 언어에는 C, C++, FORTRAN, 파스칼이 있고, BASIC과 FORTH는 일반적으로 인터프리터 방식입니다. 명령어 세트가 CPU마다 다르므로, 컴파일러와 인터프리터는 특정 프로세서 아키텍처를 타겟팅해야 합니다.
인텔과 모토로라 같은 제조사들은 새 CPU를 하위 호환되도록 설계하여 호환성 문제를 완화합니다. 예를 들어, 펜티엄 IV 프로세서는 전체 80386 명령어 세트에 추가 명령어를 지원합니다. 80386용으로 컴파일된 코드는 펜티엄에서 실행되지만, 펜티엄 전용 명령어를 사용하는 코드는 80386에서 실행되지 않습니다.
컴파일러는 보통 개발자가 타겟 CPU를 선택하게 합니다. 80386용으로 컴파일하면 구형 하드웨어와의 호환성을 보장하고, 펜티엄용으로 컴파일하면 사용 가능한 경우 새로운 기능을 활용할 수 있습니다.
관련 워크시트