[asm] IA-32 Instruction 에서 ModR/M byte 의 해석.

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 순으로 비트를 할당한다.

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

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 이 된다.