Таблица 3.5. Значения байта mod r/m
адресация)
/цифра (код операции)
reg
Эффективный адрес
[BX+SI]
[BX+DI]
[BP+SI]
[BP+DI]
[SI]
[DI]
смещ 16
[ВХ]
mod
00
00
00
00
00
00
00
00
01
01
01
01
r/m
000
001
010
100
101
ПО
111
000
001
010
100
AL
AX
EAX
0
000
CL
CX
ECX
1
001
DL
DX
EDX
2
010
BL
BX
EBX
3
on
AH
SP
ESP
4
100
CH
BP
EBP
5
101
DH
SI
ESI
6
BH
DI
EDI
7
111
значения mod r/m
00
01
02
03
04
05
06
07
40
41
42
43
44
08
09
Oa
Ob
Oc
Od
Oe
Of
48
49
4a
4b
4c
10
11
12
13
14
15
16
17
50
51
52
53
54
18
19
la
58
59
5a
5b
5c
20
21
22
23
24
25
26
27
60
61
62
63
64
28
29
2a
2b
2c
2d
2e
2f
68
69
6a
6b
6c
30
31
32
33
34
35
36
37
70
71
72
73
74
38
39
За
3b
3c
3d
3e
3f
78
79
7a
7b
7c
Формат машинных команд IA-32 67
Эффективный адрес
[ВР]+смещ_8
ESP/SP/AH
ЕВР/ВР/СН
EDI/DI/BH
mod
01
01
01
10
10
10
10
10
10
10
10
11
11
11
И
11
11
11
11
r/m
101
110
111
000
001
010
011
100
101
110
111
000 .
001
010
011
100
101
по
111
значения mod г/т
45
46
47
80
81
82
83
84
85
86
87
сО
с2
сЗ
с4
с5
с7
4d
4е
4f
88
89
8а
8с
8d
8е
8f
с8
с9
са
cb
cd
се
cf
55
56
57
90
91
92
93
94
95
96
97
dO
d2
d3
d4
d5
d6
d7
5d
5e
5f
98
99
9a
9b
9c
9d
9e
9f
d8
d9
Da
Db
DC
Dd
De
Df
65
66
67
aO
a2
a3
a4
a5
a6
a7
eO
el
e2
e3
e4
e5
e6
6d
6e
6f
a8
a9
aa
ab
ac
ad
ae
af
e8
e9
ea
eb
ec
ed
ее
ef
75
76
77
bO
b2
b3
b4
b5
b6
77
ГО
G
f4
fS
f6
7d
7e
7f
b8
b9
ba
bb
bd
be
bf
fa
fc
fd
fe
ff
Таблица З.6. Значения байта mod r/m (32-разрядная адресация)
r32
/цифра (код операции)
reg
Эффективный адрес
[ЕАХ]
[ЕСХ]
[EDX]
[ЕВХ]
[sib]
Смещ 32
[ESI]
[EDI]
[ЕАХ]+смещ_8
[ЕСХ]+смещ_8
mod
00
00
00
00
00
00
00
00
01
01
01
r/m
ооо
001
010
100
101
по
111
000
001
010
ЕАХ
0
000
ЕСХ
1
001
EDX
2
010
ЕВХ
3
011
ESP
4
100
ЕВР
5
101
ESI
6
ПО
EDI
7
111
Шестнадцатеричные значения mod
00
01
02
03
04
05
06
07
40
41
42
08
09
Оа
Ob
Ос
Od
Ое
Of
48
49
4а
10
11
12
13
14
15
16
17
50
51
52
18
19
1а
1с
1е
58
59
5а
20
21
22
23
24
25
26
27
60
61
62
28
29
2а
2с
2d
2е
2f
68
69
6а
30
31
32
33
34
35
36
37
70
71
72
38
39
За
Зс
3d
Зе
3f
78
79
7а
продолжение
68 Глава 3. Система команд
IA32
Таблица 3.6 (продолжение)
Эффективный адрес
8
[ЕВР]+смещ_8
[ЕАХ]+смещ_32
[ЕСХ]+смещ_32
[ЕВХ]+смещ_32
[SIB]
[ЕВР]+смещ_32
EAX/AX/AL
ECX/CX/CL
EDX/DX/DL
ESP/SP/AH
ЕВР/ВР/СН
ESI/SI/DH
EDI/DI/BH
mod
01
01
01
01
01
10
10
10
10
10
10
10
10
11
11
11
11
11
11
И
11
r/m
011
100
101
по
111
000
001
010
011
100
101
по
111
000
001
010
011
100
101
110
111
значения mod
43
44
45
46
47
80
81
82
83
84
85
86
87
сО
с2
сЗ
с4
с5
с7
4с
4d
4е
4f
.
88
89
8а
8с
8d
8е
8f
С8
С9
са
cb
cd
се
cf
53
54
55
56
57
90
91
92
93
94
95
96
97
dO
d2
d3
d4
d5
d6
d7
5b
5c
5d
5e
5f
98
99
9a
9b
9c
9d
9e
9f
d8
d9
Da
Db
DC
Dd
De
Df
63
64
65
66
67
aO
a2
a3
a4
a5
a6
a7
eO
el
e2
e3
e4
e5
e6
e7
6b
6c
6d
6e
6f
a8
a9
aa
ab
ac
ad
ae
af
e8
e9
ea
eb
ec
ed
ее
ef
73
74
75
76
77
bO
b2
b6
77
fi)
О
f4
f5
f6
7b
7c
7d
7e
7f
b8
b9
ba
bb
bd
be
bf
re
fa
ft
fc
fd
fe
ff
Рассмотрим пример использования данных таблиц при значении байта mod r/m
равном 87h. Для восстановления местонахождения операндов данной машинной
команды следует найти это значение в одной из таблиц (какой таблицей восполь-
зоваться, зависит от текущего режима адресации) и по первому столбцу строки,
содержащей код 87h, определить местонахождение первого операнда. В нашем слу-
чае адрес операнда формируется из содержимого регистра ВХ и
сме-
щения, значение которого следует искать в следующих за байтом mod r/m двух бай-
тах. Второй столбец той же строки содержит значение поля mod. Третье поле байта
mod r/m можно
переместившись вверх по столбцу, содержащему значение 87h,
до пересечения со строкой reg или /цифра. При этом будет выбрано значение, иден-
тифицирующее один из регистров или продолжение кода операции. Что именно —
определяется либо самим кодом операции, либо значением бита w в сочетании
с текущей разрядностью адреса (см. ранее).
При использовании 32-разрядной адресации содержимое байта mod r/m трак-
туется несколько иначе из-за наличия в формате машинной команды байта sib
(см. подраздел «Байт масштаба, индекса и
Формат машинных команд IA-32 69
Некоторые машинные команды могут работать с сегментными регистрами. Да-
лее приведены соглашения по кодированию сегментных регистров. В дальнейшем
изложении будем различать два набора регистров:
sreg86 — сегментные регистры, существовавшие в архитектуре процессоров
и i80286;
И
— сегментные регистры архитектуры процессоров i80386 и выше.
Различие наборов состоит в том, что кодируются они различным количеством
битов: sreg86 — двумя битами (табл. 3.7), a sreg386 — тремя (табл. 3.8).
Таблица 3.7. Кодировка сегментных регистров в наборе sreg86
Код в поле sreg86
00
01
10
11
Сегментный регистр
ES
CS
SS
DS
Таблица 3.8. Кодировка сегментных регистров в наборе sreg386
Код в поле sreg386
000
001
010
100
101 GS
Сегментный регистр
ES
CS
SS
DS
FS
Одна из целочисленных команд — команда MOV — может оперировать систем-
ными регистрами. Кодировка этих регистров приведена в табл. 3.9.
Таблица 3.9. Кодировка системных регистров в команде MOV
Код в поле creg
000
001
010
100
101
но
111
Регистры управления
CRO
—
CR2
CR3
CR4
—
—
-
Регистры отладки
DRO
DR1
DR2
DR3
—
—
DR6
DR7
70 Глава 3. Система команд процессора IA32
Байт масштаба, индекса и базы
Байт масштаба, индекса и базы (Scale-Index-Base — sib) используется для расши-
рения возможностей адресации операндов. На наличие байта sib в машинной ко-
манде указывает сочетание одного из значений 01 или 10 поля mod и значения поля
= 100. Байт sib состоит из трех элементов (табл.
В поле масштаба (ss) размещается масштабный
для индексного
компонента index, занимающего следующие три бита байта sib. В поле ss может
содержаться значение 1, 2, 4 или 8. При вычислении эффективного адреса на
это значение будет умножаться содержимое индексного регистра. Более по-
дробно, с практической точки зрения, эта расширенная возможность индекса-
ции рассматривается при обсуждении массивов в главе 13.
Поле index позволяет хранить номер индексного регистра, содержимое которо-
го применяется для вычисления эффективного адреса операнда.
и Поле base требуется для хранения номера базового регистра, содержимое кото-
рого также применяется для вычисления эффективного адреса операнда. В ка-
честве базового и индексного регистров могут использоваться большинство
регистров общего назначения.
Таблица
Значения байта sib (32-разрядная адресация)
База (base)
Масштабирование
индексного
регистра
[ЕАХ]
[ЕСХ]
[EDX]
[ЕВХ]
—
[ЕВР]
[ESI]
[EDI]
[ЕАХ*2]
[ЕСХ*2]
[EDX*2]
[ЕВХ*2]
—
[ЕВР*2]
[ESI*2]
[EDI*2]
[ЕАХ*4]
Масштабный
множитель
(ss)
00
00
00
00
00
00
00
00
01
01
01
01
01
01
01
01
10
Индекс
(index)
000
001
010
100
101
ПО
111
000
001
010
100
101
110
111
000
EAX
000
ЕСХ
001
EDX
010
ЕВХ
ESP
100
*
110
EDI
111
значения sib
00
08
10
18
20
28
30
38
40
48
50
58
60
68
70
78
80
01
09
11
19
21
29
31
39
41
49
51
59
61
69
71
79
81
02
OA
12
1A
22
2A
32
ЗА
42
4A
52
5A
62
6A
72
7A
82
03
OB
13
23
2B
33
3B
43
4B
53
5B
63
6B
73
7B
83
04
ОС
14
1C
24
2C
34
3C
44
4C
54
5C
64
6C
74
7C
84
05
OD
15
25
2D
35
3D
45
4D
5D
65
6D
75
7D
85
06
OE
16
26
2E
36
3E
46
4E
56
5E
66
6E
76
7E
86
07
OF
17
27
2F
37
3F
47
4F
57
5F
67
6F
77
7F
87
Формат машинных команд
71
Масштабирование
индексного
регистра
[ЕСХ*4]
[EDX*4]
[ЕВХ*4]
—
[ЕВР*4]
[ES1*4]
[EDI*4]
[ЕАХ*8]
[EDX*8]
—
[ЕВР*8]
[ESI*8]
[EDI*8]
Масштабный
множитель
(SS)
10
10
10
10
10
10
10
И
И
И
и
11
и
11
11
Индекс
(index)
001
010
100
101
ПО
111
000
001
010
on
100
101
ПО
111
значения sib
88
90
98
АО
А8
ВО
В8
СО
С8
DO
D8
ЕО
Е8
FO
F8
89
91
99
А1
А9
В1
В9
С1
С9
D1
D9
Е1
Е9
F1
F9
8А
92
9А
А2
АА
В2
ВА
С2
СА
D2
DA
Е2
ЕА
F2
FA
8В
93
9В
A3
АВ
ВЗ
ВВ
СЗ
СВ
D3
DB
ЕЗ
F3
FB
8С
94
9С
А4
АС
В4
ВС
С4
сс
D4
DC
Е4
ЕС
F4
FC
8D
95
9D
А5
AD
В5
BD
С5
CD
D5
DD
Е5
ED
F5
FD
8Е
96
9Е
А6
АЕ
В6
BE
С6
СЕ
D6
DE
Е6
ЕЕ
F6
FE
8F
97
9F
А7
AF
В7
BF
С7
CF
D7
DF
Е7
EF
F7
FF
По значению байта sib легко восстановить компоненты машинных команд, со-
держащие адрес операнда с учетом его масштабирования.
Одно значение базового регистра (base) в табл. 3.10 замещено символом звез-
дочки (*). Это означает наличие в команде адреса
без базы, если mod рав-
но 00, и [ЕВР] — в противном случае. Такой подход обеспечивает следующие режи-
мы адресации:
и
если mod=01;
II
если
Do'stlaringiz bilan baham: |