차이

이 문서의 선택한 이전 버전과 현재 버전 사이의 차이를 보여줍니다.

차이 보기로 연결

80x86아키텍쳐 [2012/06/01 14:00]
z3moon 새로 만듦
80x86아키텍쳐 [2012/06/01 14:56] (현재)
z3moon
줄 9: 줄 9:
  
 CPU 가 메모리나 IO 와 통신할 때 어드레스 버스에 메모리나 IO 장치포트의 위치를 나타내는 값을 넣고(address), CPU 나 IO, 메모리 장치는 데이터 버스에 데이터를 넣음으로써 이를 전달한다. 컨트롤 버스는 데이터가 흘러가는 방향을 지정해주는 신호를 담고 있다. CPU 가 메모리나 IO 와 통신할 때 어드레스 버스에 메모리나 IO 장치포트의 위치를 나타내는 값을 넣고(address), CPU 나 IO, 메모리 장치는 데이터 버스에 데이터를 넣음으로써 이를 전달한다. 컨트롤 버스는 데이터가 흘러가는 방향을 지정해주는 신호를 담고 있다.
 +
 +===== 레지스터 =====
 +80x86 에서 일어나는 거의 모든 연산에는 적어도 하나 이상의 레지스터가 사용.
 +
 +종류
 +  * 범용 레지스터
 +  * 어플리케이션 레지스터
 +  * <fc #808080>세그먼트 레지스터 <sub>- 32비트 운영체제에서는 거의 사용되지 않음</sub></fc>
 +  * <fc #808080>커널 모드 레지스터 <sub>- 운영체제나 디버거, 혹은 시스템 툴에서 사용하기 위한 것</sub></fc>
 +
 +==== 범용 레지스터 ====
 +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)
 +
 +정리하자면
 +
 +{{https://lh4.googleusercontent.com/-ykt8DKbl7dQ/T8hVSJ5T6qI/AAAAAAAAEaY/TomaRcS0zhc/s514/common_regi.png}}
 +
 +보는 바와 같이 이들은 공간이 서로 겹쳐있기에 적절한 레지스터를 사용하는 것이 중요하다. **하나의 레지스터를 변경함으로써 3개의 레지스터가 바뀔 수 있다는 것을 기억하자. 예를 들어 EAX 를 변경하면 AL, AH, AX 에 영향을 준다.**
 +
 +==== EFLAGS 레지스터 ====
 +32비트 EFLAGS 레지스터는 용도에 따른 1비트짜리 boolean 이 모여있는 레지스터이다. 대부분의 비트는 커널 모드 기능을 위해 예약되어 있어서 프로그래머가 알 필요가 없지만 아래 8개의 비트는 어플리케이션 프로그래머가 알아야 한다.
 +
 +{{https://lh3.googleusercontent.com/-EkLaEK7k-Gk/T8hYnENSLyI/AAAAAAAAEas/EjOHTjfjRuI/s345/eflags_regi.png}}
 +
 +특히 오버플로우, 자리올림, 부호, 제로 이 4개의 플래그는 '상태 코드' 라 부르며 아주 중요하다. 이전 연산의 결과에 따라 수시로 변경되기 때문이다.
 +
 +예를 들어 두 값을 비교한 후에 상태 코드 플래그를 보면 한 값이 다른 값에 비해 작은지, 같은지, 혹은 큰지를 알 수 있다.
  
 {{tag>"폰 노이만" 80x86}} {{tag>"폰 노이만" 80x86}}