Wednesday 16 October 2024 (GMT+0300)
Форматы команд: Байты ModR/M и SIB
|
|
Программирование -
Архитектура и система команд микропроцессоров x86
|
Во многих командах процессора байты ModR/M и SIB следуют за байтом (байтами) кода операции. Эти байты содержат следующую информацию:
- тип индексации или номер регистра, используемого в команде;
- используемый регистр или дополнительную информацию о коде операции;
- информацию о базе, индексе и масштабе.
Байт ModR/M состоит из трех информационных полей:
- поле mod содержит два наиболее значимых бита (7 и 6 биты) и в комбинации с полем r/m определяет 32 возможных типа адресации (8 регистровых и 24 индексных);
- поле reg содержит следующие за полем mod три бита (5, 4 и 3 биты) и определяет либо номер регистра, либо три дополнительных бита кода операции;
- поле r/m содержит три последних значащих бита байта ModR/M (2, 1 и 0 биты) и может определять номер регистра, в котором находится операнд, или представлять совместно с полем mod 32 возможных типа адресации.
32-битные базовые и масштабируемые индексные формы адресации требуют наличия SIB байта. Определенная кодировка ModR/M байта сигнализирует о присутствии SIB байта. Байт SIB состоит из следующих полей:
- поле ss , занимающее два наиболее значимых бита (7 и 6 биты), определяет масштабный множитель;
- поле index , занимающее следующие три бита за полем ss (5, 4, и 3 биты), определяет номер индексного регистра;
- поле base , занимающее оставшиеся три бита (2, 1 и 0 биты), определяет номер базового регистра.
На рис. 5.2. показаны форматы ModR/M и SIB байтов.
Рис. 5.2. Формат байтов ModR/M и SIB
Значения ModR/M и SIB байтов и соответствующие им формы адресации показаны в таблицах 5.2., 5.3., 5.4. В таб. 5.2. представлены 16-битные формы адресации, определяемые байтом ModR/M. В таб. 5.3. представлены 32-битные формы адресации, определяемые байтом ModR/M. В таб. 5.4. представлены 32-битные формы адресации, определяемые байтом SIB.
Таблица 5.2. 16-битные формы адресации, определяемые байтом ModR/M
r8(/r)
|
AL
|
CL
|
DL
|
BL
|
AH
|
CH
|
DH
|
BH
|
r16(/r)
|
AX
|
CX
|
DX
|
BX
|
SP
|
BP
|
SI
|
DI
|
r32(/r)
|
EAX
|
ECX
|
EDX
|
EBX
|
ESP
|
EBP
|
ESI
|
EDI
|
/digit (Opcode)
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
REG =
|
000
|
001
|
010
|
011
|
100
|
101
|
110
|
111
|
Эффективный адрес
|
Mod
|
R/M
|
Значение ModR/M в шестнадцатеричной системе исчисления
|
[BX+SI]
|
00
|
000
|
00
|
08
|
10
|
18
|
20
|
28
|
30
|
38
|
[BX+DI]
|
001
|
01
|
09
|
11
|
19
|
21
|
29
|
31
|
39
|
[BP+SI]
|
010
|
02
|
0A
|
12
|
1A
|
22
|
2A
|
32
|
3A
|
[BP+DI]
|
011
|
03
|
0B
|
13
|
1B
|
23
|
2B
|
33
|
3B
|
[SI]
|
100
|
04
|
0C
|
14
|
1C
|
24
|
2C
|
34
|
3C
|
[DI]
|
101
|
05
|
0D
|
15
|
1D
|
25
|
2D
|
35
|
3D
|
disp16
|
110
|
06
|
0E
|
16
|
1E
|
26
|
2E
|
36
|
3E
|
[BX]
|
111
|
07
|
0F
|
17
|
1F
|
27
|
2F
|
37
|
3F
|
[BX+SI]+disp8
|
01
|
000
|
40
|
48
|
50
|
58
|
60
|
68
|
70
|
78
|
[BX+DI]+disp8
|
001
|
41
|
49
|
51
|
59
|
61
|
69
|
71
|
79
|
[BP+SI]+disp8
|
010
|
42
|
4A
|
52
|
5A
|
62
|
6A
|
72
|
7A
|
[BP+DI]+disp8
|
011
|
43
|
4B
|
53
|
5B
|
63
|
6B
|
73
|
7B
|
[SI]+disp8
|
100
|
44
|
4C
|
54
|
5C
|
64
|
6C
|
74
|
7C
|
[DI]+disp8
|
101
|
45
|
4D
|
55
|
5D
|
65
|
6D
|
75
|
7D
|
[BP]+disp8
|
110
|
46
|
4E
|
56
|
5E
|
66
|
6E
|
76
|
7E
|
[BX]+disp8
|
111
|
47
|
4F
|
57
|
5F
|
67
|
6F
|
77
|
7F
|
[BX+SI]+disp16
|
10
|
000
|
80
|
88
|
90
|
98
|
A0
|
A8
|
B0
|
B8
|
[BX+DI]+disp16
|
001
|
81
|
89
|
91
|
99
|
A1
|
A9
|
B1
|
B9
|
[BP+SI]+disp16
|
010
|
82
|
8A
|
92
|
9A
|
A2
|
AA
|
B2
|
BA
|
[BP+DI]+disp16
|
011
|
83
|
8B
|
93
|
9B
|
A3
|
AB
|
B3
|
BB
|
[SI]+disp16
|
100
|
84
|
8C
|
94
|
9C
|
A4
|
AC
|
B4
|
BC
|
[DI]+disp16
|
101
|
85
|
8D
|
95
|
9D
|
A5
|
AD
|
B5
|
BD
|
[BP]+disp16
|
110
|
86
|
8E
|
96
|
9E
|
A6
|
AE
|
B6
|
BE
|
[BX]+disp16
|
111
|
87
|
8F
|
97
|
9F
|
A7
|
AF
|
B7
|
BF
|
EAX/AX/AL
|
11
|
000
|
C0
|
C8
|
D0
|
D8
|
E0
|
E8
|
F0
|
F8
|
ECX/CX/CL
|
001
|
C1
|
C9
|
D1
|
D9
|
E1
|
E9
|
F1
|
F9
|
EDX/DX/DL
|
010
|
C2
|
CA
|
D2
|
DA
|
E2
|
EA
|
F2
|
FA
|
EBX/BX/BL
|
011
|
C3
|
CB
|
D3
|
DB
|
E3
|
EB
|
F3
|
FB
|
ESP/SP/AH
|
100
|
C4
|
CC
|
D4
|
DC
|
E4
|
EC
|
F4
|
FC
|
EBP/BP/CH
|
101
|
C5
|
CD
|
D5
|
DD
|
E5
|
ED
|
F5
|
FD
|
ESI/SI/DH
|
110
|
C6
|
CE
|
D6
|
DE
|
E6
|
EE
|
F6
|
FE
|
EDI/DI/BH
|
111
|
C7
|
CF
|
D7
|
DF
|
E7
|
EF
|
F7
|
FF
|
Примечание:
|
1. disp8 обозначает 8-битное смещение следующее за ModR/M
байтом, которое должно быть знакорасширено до 16
бит и прибавлено к индексу.
|
2. disp16 обозначает 16-битное смещение следующее за ModR/M
байтом, которое должно быть прибавлено к индексу.
|
Таблица 5.3. 32-битные формы адресации, определяемые байтом ModR/M
r8(/r)
|
AL
|
CL
|
DL
|
BL
|
AH
|
CH
|
DH
|
BH
|
r16(/r)
|
AX
|
CX
|
DX
|
BX
|
SP
|
BP
|
SI
|
DI
|
r32(/r)
|
EAX
|
ECX
|
EDX
|
EBX
|
ESP
|
EBP
|
ESI
|
EDI
|
/digit (Opcode)
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
REG =
|
000
|
001
|
010
|
011
|
100
|
101
|
110
|
111
|
Эффективный адрес
|
Mod
|
R/M
|
Значение ModR/M в шестнадцатеричной системе исчисления
|
[EAX]
|
00
|
000
|
00
|
08
|
10
|
18
|
20
|
28
|
30
|
38
|
[ECX]
|
001
|
01
|
09
|
11
|
19
|
21
|
29
|
31
|
39
|
[EDX]I]
|
010
|
02
|
0A
|
12
|
1A
|
22
|
2A
|
32
|
3A
|
[EBX]I]
|
011
|
03
|
0B
|
13
|
1B
|
23
|
2B
|
33
|
3B
|
[--][--]
|
100
|
04
|
0C
|
14
|
1C
|
24
|
2C
|
34
|
3C
|
disp32
|
101
|
05
|
0D
|
15
|
1D
|
25
|
2D
|
35
|
3D
|
[ESI]
|
110
|
06
|
0E
|
16
|
1E
|
26
|
2E
|
36
|
3E
|
[EDI]
|
111
|
07
|
0F
|
17
|
1F
|
27
|
2F
|
37
|
3F
|
[EAX]+disp8
|
01
|
000
|
40
|
48
|
50
|
58
|
60
|
68
|
70
|
78
|
[ECX]+disp8
|
001
|
41
|
49
|
51
|
59
|
61
|
69
|
71
|
79
|
[EDX]+disp8
|
010
|
42
|
4A
|
52
|
5A
|
62
|
6A
|
72
|
7A
|
[EBX]+disp8
|
011
|
43
|
4B
|
53
|
5B
|
63
|
6B
|
73
|
7B
|
[--][--]+disp8
|
100
|
44
|
4C
|
54
|
5C
|
64
|
6C
|
74
|
7C
|
[EBP]+disp8
|
101
|
45
|
4D
|
55
|
5D
|
65
|
6D
|
75
|
7D
|
[ESI]+disp8
|
110
|
46
|
4E
|
56
|
5E
|
66
|
6E
|
76
|
7E
|
[EDI]+disp8
|
111
|
47
|
4F
|
57
|
5F
|
67
|
6F
|
77
|
7F
|
[EAX]+disp32
|
01
|
000
|
40
|
48
|
50
|
58
|
60
|
68
|
70
|
78
|
[ECX]+disp32
|
001
|
41
|
49
|
51
|
59
|
61
|
69
|
71
|
79
|
[EDX]+disp32
|
010
|
42
|
4A
|
52
|
5A
|
62
|
6A
|
72
|
7A
|
[EBX]+disp32
|
011
|
43
|
4B
|
53
|
5B
|
63
|
6B
|
73
|
7B
|
[--][--]+disp32
|
100
|
44
|
4C
|
54
|
5C
|
64
|
6C
|
74
|
7C
|
[EBP]+disp32
|
101
|
45
|
4D
|
55
|
5D
|
65
|
6D
|
75
|
7D
|
[ESI]+disp32
|
110
|
46
|
4E
|
56
|
5E
|
66
|
6E
|
76
|
7E
|
[EDI]+disp32
|
111
|
47
|
4F
|
57
|
5F
|
67
|
6F
|
77
|
7F
|
EAX/AX/AL
|
11
|
000
|
C0
|
C8
|
D0
|
D8
|
E0
|
E8
|
F0
|
F8
|
ECX/CX/CL
|
001
|
C1
|
C9
|
D1
|
D9
|
E1
|
E9
|
F1
|
F9
|
EDX/DX/DL
|
010
|
C2
|
CA
|
D2
|
DA
|
E2
|
EA
|
F2
|
FA
|
EBX/BX/BL
|
011
|
C3
|
CB
|
D3
|
DB
|
E3
|
EB
|
F3
|
FB
|
ESP/SP/AH
|
100
|
C4
|
CC
|
D4
|
DC
|
E4
|
EC
|
F4
|
FC
|
EBP/BP/CH
|
101
|
C5
|
CD
|
D5
|
DD
|
E5
|
ED
|
F5
|
FD
|
ESI/SI/DH
|
110
|
C6
|
CE
|
D6
|
DE
|
E6
|
EE
|
F6
|
FE
|
EDI/DI/BH
|
111
|
C7
|
CF
|
D7
|
DF
|
E7
|
EF
|
F7
|
FF
|
Примечание:
|
1. [-][-] обозначает, что за ModR/M байтом следует SIB байт.
|
2. disp8 обозначает 8-битное смещение следующее за SIB байтом, которое должно быть знакорасширено до 16 бит и прибавлено к индексу.
|
3. disp32 обозначает 32-битное смещение следующее за SIB байтом, которое должно быть прибавлено
к индексу.
|
Таблица 5.4. 32-битные формы адресации, определяемые байтом SIB
r32
|
EAX
|
ECX
|
EDX
|
EBX
|
ESP
|
[*]
|
ESI
|
EDI
|
Base =
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
Base =
|
000
|
001
|
010
|
011
|
100
|
101
|
110
|
111
|
Масштабный индекс
|
SS
|
Индекс
|
Значение SIB в
шестнадцатеричной системе исчисления
|
[EAX]
|
00
|
000
|
00
|
01
|
12
|
13
|
24
|
25
|
36
|
37
|
[ECX]
|
001
|
08
|
09
|
1A
|
1B
|
2C
|
2D
|
3E
|
3F
|
[EDX]
|
010
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
[EBX]
|
011
|
18
|
19
|
1A
|
1B
|
1C
|
1D
|
1E
|
1F
|
нет
|
100
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
[EBP]
|
101
|
28
|
29
|
2A
|
2B
|
2C
|
2D
|
2E
|
2F
|
[ESI]
|
110
|
30
|
31
|
32
|
33
|
34
|
35
|
36
|
37
|
[EDI]
|
111
|
38
|
39
|
3A
|
3B
|
3C
|
3D
|
3E
|
3F
|
[EAX*2]
|
01
|
000
|
40
|
41
|
42
|
43
|
44
|
45
|
46
|
47
|
[ECX*2]
|
001
|
48
|
49
|
4A
|
4B
|
4C
|
4D
|
4E
|
4F
|
[EDX*2]
|
010
|
50
|
51
|
52
|
53
|
54
|
55
|
56
|
57
|
[EBX*2]
|
011
|
58
|
59
|
5A
|
5B
|
5C
|
5D
|
5E
|
5F
|
нет
|
100
|
60
|
61
|
62
|
63
|
64
|
65
|
66
|
67
|
[EBP*2]
|
101
|
68
|
69
|
6A
|
6B
|
6C
|
6D
|
6E
|
6F
|
[ESI*2]
|
110
|
70
|
71
|
72
|
73
|
74
|
75
|
76
|
77
|
[EDI*2]
|
111
|
78
|
79
|
7A
|
7B
|
7C
|
7D
|
7E
|
7F
|
[EAX*4]
|
01
|
000
|
80
|
81
|
82
|
83
|
84
|
85
|
86
|
87
|
[ECX*4]
|
001
|
88
|
89
|
8A
|
8B
|
8C
|
8D
|
8E
|
8F
|
[EDX*4]
|
010
|
90
|
91
|
92
|
93
|
94
|
95
|
96
|
97
|
[EBX*4]
|
011
|
98
|
99
|
9A
|
9B
|
9C
|
9D
|
9E
|
9F
|
нет
|
100
|
A0
|
A1
|
A2
|
A3
|
A4
|
A5
|
A6
|
A7
|
[EBP*4]
|
101
|
A8
|
A9
|
AA
|
AB
|
AC
|
AD
|
AE
|
AF
|
[ESI*4]
|
110
|
B0
|
B1
|
B2
|
B3
|
B4
|
B5
|
B6
|
B7
|
[EDI*4]
|
111
|
B8
|
B9
|
BA
|
BB
|
BC
|
BD
|
BE
|
BF
|
[EAX*8]
|
11
|
000
|
C0
|
C1
|
C2
|
C3
|
C4
|
C5
|
C6
|
C7
|
[ECX*8]
|
001
|
C8
|
C9
|
CA
|
CB
|
CC
|
CD
|
CE
|
CF
|
[EDX*8]
|
010
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
[EBX*8]
|
011
|
D8
|
D9
|
DA
|
DB
|
DC
|
DD
|
DE
|
DF
|
нет
|
100
|
E0
|
E1
|
E2
|
E3
|
E4
|
E5
|
E6
|
E7
|
[EBP*8]
|
101
|
E8
|
E9
|
EA
|
EB
|
EC
|
ED
|
EE
|
EF
|
[ESI*8]
|
110
|
F0
|
F1
|
F2
|
F3
|
F4
|
F5
|
F6
|
F7
|
[EDI*8]
|
111
|
F8
|
F9
|
FA
|
FB
|
FC
|
FD
|
FE
|
FF
|
|
|
Примечание:
|
|
|
[*] обозначает disp32 без
базового регистра, если mod = 00, и [EBP]
|
|
в противном случае. Это
обеспечивает следующие формы адресации:
|
|
|
disp32[index]
|
(mod = 00)
|
|
|
disp8[EBP][index]
|
(mod = 01)
|
|
|
disp32[EBP][index]
|
(mod = 10)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru