80x86 아키텍쳐

인텔의 80×86 은 일반적으로 존 폰 노이만 머신으로 분류.

중앙처리(CPU), 메모리, 입출력(I/O) 장치의 세개의 블록으로 이루어짐

이들은 시스템 버스 (어드레스, 데이터, 컨트롤 버스) 를 통해 서로 연결된다.

CPU 가 메모리나 IO 와 통신할 때 어드레스 버스에 메모리나 IO 장치포트의 위치를 나타내는 값을 넣고(address), CPU 나 IO, 메모리 장치는 데이터 버스에 데이터를 넣음으로써 이를 전달한다. 컨트롤 버스는 데이터가 흘러가는 방향을 지정해주는 신호를 담고 있다.

레지스터

80×86 에서 일어나는 거의 모든 연산에는 적어도 하나 이상의 레지스터가 사용.

종류

  • 범용 레지스터
  • 어플리케이션 레지스터
  • 세그먼트 레지스터 - 32비트 운영체제에서는 거의 사용되지 않음
  • 커널 모드 레지스터 - 운영체제나 디버거, 혹은 시스템 툴에서 사용하기 위한 것

범용 레지스터

8개의 32비트 레지스터

EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP

앞에 붙어 있는 E 는 extended(확장) 을 의미하며, 다음과 같은 8개의 16비트 레지스터로 나눌 수 있다.

AX, BX, CX, DX, SI, DI, BP, SP

마지막으로 다음의 8개의 8비트 레지스터도 있다.

AL, AH, BL, BH, CL, CH, DL, DH (뒤에 L/H 는 low high)

정리하자면

보는 바와 같이 이들은 공간이 서로 겹쳐있기에 적절한 레지스터를 사용하는 것이 중요하다. 하나의 레지스터를 변경함으로써 3개의 레지스터가 바뀔 수 있다는 것을 기억하자. 예를 들어 EAX 를 변경하면 AL, AH, AX 에 영향을 준다.

EFLAGS 레지스터

32비트 EFLAGS 레지스터는 용도에 따른 1비트짜리 boolean 이 모여있는 레지스터이다. 대부분의 비트는 커널 모드 기능을 위해 예약되어 있어서 프로그래머가 알 필요가 없지만 아래 8개의 비트는 어플리케이션 프로그래머가 알아야 한다.

특히 오버플로우, 자리올림, 부호, 제로 이 4개의 플래그는 '상태 코드' 라 부르며 아주 중요하다. 이전 연산의 결과에 따라 수시로 변경되기 때문이다.

예를 들어 두 값을 비교한 후에 상태 코드 플래그를 보면 한 값이 다른 값에 비해 작은지, 같은지, 혹은 큰지를 알 수 있다.