C 마이크로프로세서 프로그래밍/마이크로프로세서
마이크로프로세서(CPU,CPU-core)는 프로그램 된 기계어 코드를 읽어 코드가 요구하는 명령어를 실행하는 모듈이다. 기계어 코드는 메모리에 존재해야 하므로 이미 어떤 식으로 든 저장되어 있어야 한다. CPU가 초기화(하드웨어 RESET 신호에 의해 동작됨)되면 정해진 메모리 위치부터 시작한다.
마이크로프로세서가 처리하는 데이터는 메모리와 레지스터간의 데이터 전송과 ALU을 통한 논리계산을 행하므로써 실행된다.
마이크로프로세서 구성요소
[+/-]레지스터
[+/-]- 일반 레지스터
- SP
- PC(IP)
- BP
특수레지스터
- FLAG
- Interrupt Mask
- 권한 레벨
초기화와 RESET 신호
[+/-]처음 전원이 인가되면 하드웨어로 RESET 신호를 만들어 주어야 한다. 동작 중에도 초기화 해서 마이크로프로세서를 처음부터 다시 시작하는 초기화를 해야한다. 따라서 스위치를 전원 초기 RESET 회로와 결합하여 사용해야 한다.
초기 기동
[+/-]CPU가 RESET 시 정해진 방식에 의해 시작한다. 우선 많은 메모리중에 어디서 부터 실행할 것인지를 결정해야 한다.
이것은 2가지 방식으로 결정된다:
- 정해진 주소로 PC에 설정하고 패치한다.
- 특정 메모리의 영역에서 부터 주소값을 읽어 해당 주소를 PC에 설정해 시작한다.
마이크로프로세서 기본 기능
[+/-]기본기능은 기계어 코드에 의해 이루어 지고, 기계어 코드는 프로그램 개발자에 의해 작성된다. 기계어 명령어 세트는 다음과 같은 기능을 한다:
CPU 마다 어셈블리 표현 방식은 다르나 일반적인 개념을 위해 다음과 같이 표시 한다. 따라서 정해진 CPU 없이 가상의 명령어 이다. 그리고 어떤 종류의 명령어는 CPU 마다 존재하지 않는 경우가 있다.
데이터 전송 명령어
[+/-]메모리와 레지스터 간 전송
- MOV R0,00301000h ; 절대주소 지정
- MOV R0,[BP] ; 레지스터 index
레지스터 간 전송
- MOV R0,R1
- MOV R0,SP
스택명령
- PUSH R0
- PUSH 1000h
- POP R0
ALU을 통한 연산 명령어
[+/-]사칙연산
- ADD R0,R1
- SUB R0,R1
- MUL R0,R2
- DIV R0,R2
- CMP R0,01234H
- INC R0
- DEC R0
논리연산
- AND R0,R1
- OR R0,R1
- XOR R0,R1
쉬프트 연산
- RR R0,1
- LR R0,1
흐름제어 명령어
[+/-]점프 명령어는 프로그램의 실행 코드 위치를 변경하는 명령이다. PC 레지스터의 값을 변경함으로써 실행 코드위치가 결정된다.
절대 주소로 점프
- JUMP 200000H
- PC <= 200000H
상대 주소로 점프
- JREL $20H
- PC <= PC+상대 거리 주소값 (OFFSET), PC <= PC+ 20H
조건 점프 명령
- JEQ NextLable1
여기서 EQ는 CPU의 FLAG 레지스터 값에 의해 판단된다. 따라 이 명령이 실행되기 전에 ALU을 통한 연산이 이루어져 FLAG값이 설정되어 있어야 한다.
- CALL 3002000H
- RET
- IRET ; Interrupt Service Routine 종료
기타
[+/-]- NOP ; 아무 동작을 하지 않는다. 패치(fetch)만 일어진다. 시간 끌기 등에 사용할수 있다.
- INT 12 ; 소프트웨어 인터럽트
- EI ; Interrupt Enable - 전체 인터럽트 처리를 수용한다.
- DI ; Interrupt Disable - 전체 인터럽트 처리를 하지 않는다.
- IDLE ; idle 모드로 전환