기술탐구
[asm] IA-32 MOV 명령어 해석 [3]
appleii
2008. 9. 7. 21:27
범용 레지스터는 다음과 같은 모습이다.
초기의 16비트 레지스터인 ax, cx, dx, bx 를 확장(Extended) 하여 eax, ecx, edx, ebx 를 만들었다. 32비트 CPU라고 하더라도 16비트 레지스터인 ax 를 사용할 수 있다. 그러기 위해서는 다음과 같이 Prefix 를 붙여주어야 한다.
16비트 레지스터를 사용하여 직접 값을 입력하는(immdiate operand) mov Instruction format 은 다음과 같다.
Prefix 로는 66h 를 사용한다.
mov ax, 0x0102 와 같은 명령은 다음과 같이 나타낸다.
01100110 10111000 00000010 00000001 = 66 B8 02 01
Prefix = 66h , W=1 이다. 32비트 레지스터를 사용할 때, W=1 이면 eax, ecx ... 등을 사용하겠다는 뜻이지만 66h 를 앞에 붙이면 W=1 일 때 16비트 레지스터 ax , cx ... 가 된다.
메모리를 접근할때 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] 과 같다.

초기의 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 |
|
|
|
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] 과 같다.