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 |
Byte1 |
Byte2 |
Byte3 |
Byte4 |
|
|
|
||||||
100010 |
|
|
Mod |
REG |
R/M |
Scale |
Index |
Base |
Disp1 |
|
Byte1 |
Byte2 |
Byte3 |
Byte4 |
Byte5 |
Byte6 |
Byte7 |
||||||
100010 |
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
우선 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 |
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
변위가 32비트로 된 것 빼고는 전과 같다.
'기술탐구' 카테고리의 다른 글
[asm] IA-32 PUSH, POP 명령어 해석 (4) | 2008.09.08 |
---|---|
[asm] IA-32 MOV 명령어 해석 [3] (0) | 2008.09.07 |
[asm] IA-32 MOV 명령어 해석 [1] (0) | 2008.09.03 |
[asm] IA-32 Instruction 에서 ModR/M byte 의 해석. (2) | 2008.08.28 |
[C++Builder] property 의 유용성 (0) | 2008.08.26 |