범용 레지스터는 다음과 같은 모습이다.
초기의 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] 과 같다.
'기술탐구' 카테고리의 다른 글
[asm] 간단한 함수 호출 (0) | 2008.09.12 |
---|---|
[asm] IA-32 PUSH, POP 명령어 해석 (4) | 2008.09.08 |
[asm] IA-32 MOV 명령어 해석 [2] (0) | 2008.09.07 |
[asm] IA-32 MOV 명령어 해석 [1] (0) | 2008.09.03 |
[asm] IA-32 Instruction 에서 ModR/M byte 의 해석. (2) | 2008.08.28 |