Форматы команд: Байты 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 байтов.

 

Формат байтов 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)