[asm] IA-32 MOV 명령어 해석 [3]

범용 레지스터는 다음과 같은 모습이다.

사용자 삽입 이미지

초기의 16비트 레지스터인 ax, cx, dx, bx 를 확장(Extended) 하여 eax, ecx, edx, ebx 를 만들었다. 32비트 CPU라고 하더라도 16비트 레지스터인 ax 를 사용할 수 있다. 그러기 위해서는 다음과 같이 Prefix 를 붙여주어야 한다.

사용자 삽입 이미지

16비트 레지스터를 사용하여 직접 값을 입력하는(immdiate operand) mov Instruction format 은 다음과 같다.
Byte1 Byte2 Byte3 Byte4    
Prefix 1011 W REG Data1 Data2  

Prefix 로는 66h 를 사용한다.

mov ax, 0x0102 와 같은 명령은 다음과 같이 나타낸다.
Byte1 Byte2 Byte3 Byte4    
01100110 1011 1 000 00000010 00000001  
01100110 10111000 00000010 00000001 = 66 B8 02 01

Prefix = 66h , W=1 이다. 32비트 레지스터를 사용할 때, W=1 이면 eax, ecx ... 등을 사용하겠다는 뜻이지만 66h 를 앞에 붙이면 W=1 일 때 16비트 레지스터 ax , cx ... 가 된다.

REG W = 0 W = 1
000 AL AX
001 CL CX
010 DL DX
011 BL BX
100 AH SP
101 CH BP
110 DH SI
111 BH DI


메모리를 접근할때 mov eax, [ecx+8] 과 같이 사용할 수도 있지만 mov eax, dword ptr [ecx+8] 과 쓸 수도 있다. dword ptr 은 해당 주소에서 double word(32비트) 를 읽겠다는 뜻이다. 그럼 byte ptr 도 있을까? 물론 있다.

mov al, [ecx+8] 은 mov al, byte ptr[ecx+8] 과 같다.