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

mov 명령은 다음과 같은 형식도 있다.

mov eax, [ecx+ebx*8]

ebx*8 이 추가된 것을 알 수 있다. 이러한 형식을 위해서 명령어에 추가 바이트가 필요하다.

mov r32, r/m32  형태이므로 Instruction Format 은 다음과 같다.

Byte1 Byte2 Byte3        
100010 1 1 Mod REG R/M Scale Index Base
10001011 = 8B

Byte1 Byte2 Byte3 Byte4      
100010 1 1 Mod REG R/M Scale Index Base Disp1  


Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7
100010 1 1 Mod REG R/M Scale Index Base Disp1 Disp2 Disp3 Disp4

Byte3 이 추가된 것을 알 수 있다.


사용자 삽입 이미지

Scale 은 2비트 이며 곱하기를 뜻한다. Index는 3비트 이며 곱해지는 레지스터를 뜻한다. Base 는 3비트 이며 말 그대로 Base 이다.

mov eax, [ecx+ebx*8] 에서 Scale = 8 , Index = ebx , Base = ecx 이다.

이걸 Instruction 으로 나타내면 다음과 같다.

Byte1 Byte2 Byte3        
100010 1 1 00 000 100 11 011 001      
10001011 00000100 11011001 = 8B 04 D9
사용자 삽입 이미지

우선 ModR/M Byte 에서 첫번째 operand 와, 두번째 operand 를 찾는다. 첫번째 operand 는 eax, 두번째 operand 는 [ecx+ebx*8] 이다. 변위는 없으므로 Mod = 00 이다.

사용자 삽입 이미지
그 뒤에 SIB Byte 를 채워야 한다. 표에서 Base 인 ecx , Index 인 ebx 를 찾는다. Scale 이 8이므로 SS = 11 이다.

8비트 변위가 추가된 형태를 알아보자.

mov eax, [ecx+ebx*4+16] 에서 Displacement = 16 , Scale = 8 , Index = ebx , Base = ecx 이다.

Instruction 은 다음과 같다.

Byte1 Byte2 Byte3 Byte4      
100010 1 1 01 000 100 10 011 001 00010000  
10001011  01000100  10011001  00010000 = 8B 44 99 10

사용자 삽입 이미지

ModR/M Byte 에서 변위가 16(8비트 변위)이므로 Mod = 01 , Scaled Index 이므로 R/M = 100 이다.

사용자 삽입 이미지

표에서 오타가 난 것을 확인할 수 있다. 해당위치에는 99가 들어가야 한다. 매뉴얼 여러군데에 오타가 있으므로 주의!

변위가 8비트 변위(-128 ~ 127) 을 초과한 경우는 32비트 변위를 사용하여 표시한다.

mov eax, [ecx+ebx*4+128] 에서, Displacement = 128 , Scale = 4 , Index = ebx , Base = ecx 이다.

Instruction 은 다음과 같다.

Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7
100010 1 1 10 000 100 10 011 001 10000000 00000000 00000000 00000000
10001011 10000100 10011001 10000000 00000000 00000000 00000000 = 8B 84 99 80 00 00 00

변위가 32비트로 된 것 빼고는 전과 같다.