Intel 의 Software Developer's manual 을 보면 Instruction 의 Format 을 설명해 놓은 부분이 있다. 그중에서 ModR/M byte 의 해석을 알아본다. 일단 XOR 이 어떻게 표시되는지 알아보자.
XOR 은 31/r 로 Opcode 가 표시된다. 전체 Instruction 은 XOR r/m32, r32 로 표현된다. r/m32 , r32 는 다음과 같이 ModR/M byte 를 뜻한다.
위에서 Mod field 는 표시되지 않았는데, Mod field 는 R/M field 가 Register 냐 Memory 냐에 따라서 달라진다. Mod field 는 2비트 이다. 즉, r/m32 가 4종류가 나온다는 뜻이다. r/m32 가 Register 라면 Mod field 는 11이 된다.
위의 그림에서 Mod 는 11 이다. 즉, RM 부분이 Register 라는 뜻이다. 사용자가 접근할 수 있는 32비트 Register는 EAX 부터 EDI 까지 모두 8개이다. EAX 는 000, ECX 001, EDX 010 순으로 비트를 할당한다.
위의 그림에서 RM = 000 이므로 EAX 이다. (Mod = 11 이므로 Register) REG = 001 이므로 ECX 이다.
CMOVG 는 다음과 같이 표시한다.
XOR 를 다시 보면,
r32, r/m32 의 순서가 바뀌어 있다. 이것의 의미는 표를 볼 때 operand 를 가로에서 찾을 것인가 세로에서 찾을 것인가 하는 것이다.
operand 가 EAX, ECX 로 둘 다 같다. 하지만 다음 표에서 찾는 순서가 달라져야 한다. 둘다 r/m32 부분이 Register 이므로 Mod field 는 11이다.
따라서 XOR EAX, ECX 는 31 C8 이 되고, CMOVG EAX, ECX 는 0F 4F C1 이 된다. 표에서 찾는 방법은 바뀌었지만 ModR/M byte 에서의 field 순서는 같다.
한가지 의문이 생기는 것이 있다. 다음과 같은 명령은 어떻게 해석할까.
Opcode 부분을 보면 83/4 라고 되어 있다. 83은 알겠는데 4는 뭘까. 그것은 REG 를 나타낸 것이다.
REG 가 이미 결정되어 있으므로 r/m32 즉, R/M 부분을 결정해 주면 된다. AND EAX, 0 이라면 REG 는 4(=100) 으로 이미 결정되어 있으므로 R/M 을 EAX 로 선택하면 된다. (EAX 는 Register 이므로 Mod field 는 11)
AND 에 83/4 ib 로 되어 있는데, i 는 immediate operand 이며 명령에 직접 값을 넣을 수 있는 것을 뜻한다. b 는 byte 이다. ib 는 1byte 값을 직접 명령어에 포함시키겠다는 뜻이다. EAX 는 32비트(4바이트) 이므로 1byte 값을 EAX 에 넣으려면 나머지 3바이트를 채워야 한다. sign-extended 라고 나와 있는 것은 빈 자리를 sign bit 로 채우겠다는 뜻이다. 따라서 종합하면 AND EAX, 0 은 83 E0 00 이 된다.
XOR 은 31/r 로 Opcode 가 표시된다. 전체 Instruction 은 XOR r/m32, r32 로 표현된다. r/m32 , r32 는 다음과 같이 ModR/M byte 를 뜻한다.
위에서 Mod field 는 표시되지 않았는데, Mod field 는 R/M field 가 Register 냐 Memory 냐에 따라서 달라진다. Mod field 는 2비트 이다. 즉, r/m32 가 4종류가 나온다는 뜻이다. r/m32 가 Register 라면 Mod field 는 11이 된다.
위의 그림에서 Mod 는 11 이다. 즉, RM 부분이 Register 라는 뜻이다. 사용자가 접근할 수 있는 32비트 Register는 EAX 부터 EDI 까지 모두 8개이다. EAX 는 000, ECX 001, EDX 010 순으로 비트를 할당한다.
EAX | ECX | EDX | EBX | ESP | EBP | ESI | EDI |
000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
위의 그림에서 RM = 000 이므로 EAX 이다. (Mod = 11 이므로 Register) REG = 001 이므로 ECX 이다.
CMOVG 는 다음과 같이 표시한다.
0F 4F /r CMOVG r32, r/m32
XOR 를 다시 보면,
31 /r XOR r/m32, r32
r32, r/m32 의 순서가 바뀌어 있다. 이것의 의미는 표를 볼 때 operand 를 가로에서 찾을 것인가 세로에서 찾을 것인가 하는 것이다.
XOR EAX, ECX
CMOVG EAX, ECX
CMOVG EAX, ECX
operand 가 EAX, ECX 로 둘 다 같다. 하지만 다음 표에서 찾는 순서가 달라져야 한다. 둘다 r/m32 부분이 Register 이므로 Mod field 는 11이다.
따라서 XOR EAX, ECX 는 31 C8 이 되고, CMOVG EAX, ECX 는 0F 4F C1 이 된다. 표에서 찾는 방법은 바뀌었지만 ModR/M byte 에서의 field 순서는 같다.
XOR EAX, ECX | CMOVG EAX, ECX | ||||
Mod | REG | R/M | Mod | REG | R/M |
11 | 001 | 000 | 11 | 000 | 001 |
11001000 = C8 | 11000001 = C1 |
한가지 의문이 생기는 것이 있다. 다음과 같은 명령은 어떻게 해석할까.
Opcode 부분을 보면 83/4 라고 되어 있다. 83은 알겠는데 4는 뭘까. 그것은 REG 를 나타낸 것이다.
REG 가 이미 결정되어 있으므로 r/m32 즉, R/M 부분을 결정해 주면 된다. AND EAX, 0 이라면 REG 는 4(=100) 으로 이미 결정되어 있으므로 R/M 을 EAX 로 선택하면 된다. (EAX 는 Register 이므로 Mod field 는 11)
AND EAX, 0 | ||
Mod | REG | R/M |
11 | 100 | 000 |
11100000 = E0 |
AND 에 83/4 ib 로 되어 있는데, i 는 immediate operand 이며 명령에 직접 값을 넣을 수 있는 것을 뜻한다. b 는 byte 이다. ib 는 1byte 값을 직접 명령어에 포함시키겠다는 뜻이다. EAX 는 32비트(4바이트) 이므로 1byte 값을 EAX 에 넣으려면 나머지 3바이트를 채워야 한다. sign-extended 라고 나와 있는 것은 빈 자리를 sign bit 로 채우겠다는 뜻이다. 따라서 종합하면 AND EAX, 0 은 83 E0 00 이 된다.
'기술탐구' 카테고리의 다른 글
[asm] IA-32 MOV 명령어 해석 [2] (0) | 2008.09.07 |
---|---|
[asm] IA-32 MOV 명령어 해석 [1] (0) | 2008.09.03 |
[C++Builder] property 의 유용성 (0) | 2008.08.26 |
[C++Builder] www.winapi.co.kr 의 api 예제를 실행해보기. (0) | 2008.08.18 |
[C++Builder] Hello world. (console 프로그램 기초) (0) | 2008.08.17 |