Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Лекция 1 / Лекция 1.doc
Скачиваний:
35
Добавлен:
10.06.2015
Размер:
330.75 Кб
Скачать

Код операции

Код операции - обязательный элемент, описывающий операцию, выполняемую командой. Код операции может занимать от одного до трех байт. Для некоторых машинных команд часть битов кода операции может находиться в байте mod r/m.

Многим командам соответствует несколько кодов операций, каждый из которых определяет нюансы выполнения операции. Отметим, что поле кода операции не имеет однозначной структуры. В зависимости от конкретных команд, не обязательно разных с точки зрения языка ассемблера, оно может иметь в своем составе от одного до трех элементов, назначение которых описано в табл. 3.2. Один из этих трех элементов является непосредственно кодом операции или ее частью, остальные уточняют детали операции. Такое строение поля кода операции усложняет, в частности, процесс дизассемблирования. Для определения размера и границ очередной команды необходимо полностью проанализировать ее поле кода операции.

Таблица 3.2. Назначение дополнительных битов поля кода операции

Поле

Количество

Назначение

d

1

Определяет направление передачи данных: 0 — передача данных из регистра reg в память (или регистр), адресуемую полем т/т; 1 - передача данных из памяти (или регистра), адресуемой нолем r/m, в регистр reg. При наличии байта sib адрес операнда в памяти формируется с учетом содержимого этого байта

s

1

Задает необходимость расширения 8-разрядного непосредственного операнда до 16 или 32 бита. Старшие биты при этом заполняются значением старшего (знакового) бита

исходного 8-разрядного операнда

w

1

Определяет размер данных, которыми оперирует команда: байт, слово, двойное слово: 0 -8 битов; 1 —-16 битов для 16-разрядного размера операндов или 32 бита для 32-разрядного размера операндов

reg

3

Определяет регистр, используемый в команде. Значение поля зависит от ноля w, в том числе если поле w отсутствует (см. следующий подраздел)

Последующие поля машинной команды определяют характеристики и местоположение операндов, участвующих в операции, и особенности их использования (см. далее).

Байт режима адресации mod r/m

Байт режима адресации mod r/m, иногда называемый постбайтом, несет информацию об операндах и режиме адресации. Большинство команд процессора Intel двухоперандные. Операнды могут находиться в памяти, а также в одном или двух регистрах. Архитектура IA-32 не допускает, чтобы оба операнда команды находились в памяти. Если операнд находится в памяти, то байт mod r/m определяет компоненты (смещение, базовый и индексный регистры), используемые для вычисления его эффективного адреса. Байт mod r/m состоит из трех полей.

-Поле mod (два бита) определяет способ адресации и количество байтов, занимаемых в команде адресом операнда (поле смещения в команде). Поле mod используется совместно с полем r/m, которое определяет способ модификации адреса операнда полем смещения в команде. Поле mod в комбинации с полем r/m образует 32 возможных значения, обозначающих один из восьми регистров и 24 режима адресации. К примеру, если mod = 00, то поле смещения в команде отсутствует и адрес операнда определяется содержимым базового и/или индексного регистра. Какие именно регистры потребуются для вычисления эффективного адреса, определяется значением этого байта. Если mod = 01, то поле смещения в команде присутствует, занимает один байт и модифицируется содержимым базового и/или индексного регистра. Если mod = 10, то поле смещения в команде присутствует, занимает два или четыре байта (в зависимости от значения, действующего по умолчанию или определяемого префиксом размера адреса) и модифицируется содержимым базового и/или индексного регистра. Если mod = 11, то операндов в памяти нет — они находятся в регистрах. Это же значение байта mod используется в случае, когда команда работает с непосредственным операндом.

-Поле reg (3 бита) определяет либо регистр (табл. 3.3 и 3.4), находящийся в команде на месте второго операнда, либо возможное расширение кода операции (давая в совокупности размер поля КОП в 11 битов).

-Поле г/т используется совместно с полем mod и определяет либо регистр, находящийся в команде на месте первого операнда (если mod = 11), либо базовые и индексные регистры, применяемые для вычисления эффективного адреса (совместно с полем смещения в команде).

Таблица 3.3. Значения кодов в поле reg (поле w присутствует в команде)

Поле reg

w=0

w=1

000

AL

AX/EAX

001

CL

CX/ECX

010

DL

DX/EDX

011

BL

BX/EBX

100

AH

SP/ESP

101

CH

BP/EBP

110

DH

SI/ESI

111

BH

DI/EDI

Таблица З.4. Значения кодов в поле reg (поле w отсутствует).

Поле reg

16-разрядные операции

32-разрядные операции

000

AX

EAX

001

CX

ECX

010

DX

EDX

011

BX

EBX

100

SP

ESP

101

BP

EBP

110

SI

ESI

111

DI

EDI

В таблицах нет содержимого поля reg для 16-разрядных регистров в 32-разрядных операциях, так как в архитектуре Intel отдельно использовать старшую половину 32-разрядного регистра невозможно.

В архитектуре Intel один из операндов обязательно находится в регистре, и он может быть первым или вторым. Расположение первого и второго операндов в формате команды фиксировано. Но, например, команда MOV может выполнять пересылку как из регистра в память, так и из памяти в регистр. В машинном представлении это одна и та же команда. В ее поле reg будет содержаться код регистра (см. табл. 3.3и 3.4), а в поле r/m - код режима адресации (см. далее). Эти две команды будут различаться только одним битом d, который определяет направление передачи.

Если в команде участвуют два регистра, то в этом случае вступает в силу правило: поле reg определяет второй операнд, а поле г/т — первый. Если команда mov работает с ячейкой памяти, то в исходном тексте программы могут быть следующие варианты записи этой команды:

mov abll,ax -.пересылка содержимого ах в ячейку памяти abl1

или

mov ax,abll ;пересылка содержимого ячейки памяти abll в ах

В машинном представлении эти две команды будут выглядеть одинаково, за исключением бита d:

-для команды MOV abll,ax бит d = 0;

-для команды MOV ax,abll бит d = 1.

Наиболее сложными для декодирования являются команды с операндом в памяти. Фирма Intel сопровождает описание системы команд специальными таблицами, облегчающими интерпретацию содержимого байта mod r/m (табл. 3.5 и 3.6). С их помощью можно довольно легко восстановить компоненты, из которых формировался адрес операнда, и, в конечном итоге, восстановить соответствующую команду ассемблера для данной машинной команды.

Таблица 3.5. Значения байта mod r/m (16-разрядная адресация)

г8

AL

CL

DL

BL

AH

CH

DH

BH

г16

AX

CX

DX

BX

SP

BP

SI

DI

г32

EAX

ECX

EDX

EBX

ESP

EBP

ESI

EDI

/цифра (код операции)

0

1

2

3

4

5

6

7

reg

000

001

010

011

100

101

110

111

Эффективный адрес

mod

r/m

Шестнадцатеричныезначения mod r/m

[BX+SI]

00

000

00

08

10

18

20

28

30

38

[BX+DI]

00

001

01

09

11

19

21

29

31

39

[BP+SI]

00

010

02

0a

12

1a

22

2a

32

За

[BP+DI]

00

011

03

0b

13

1b

23

2b

33

3b

[SI]

00

100

04

0c

14

1c

24

2c

34

3c

[DI]

00

101

05

0d

15

1d

25

2d

35

3d

смещ_16

00

110

06

0e

16

1e

26

2e

36

3e

[ВХ]

00

111

07

0f

17

1f

27

2f

37

3f

[BX+SI]+ смещ_8

01

000

40

48

50

58

60

68

70

78

[BX+DI]+ смещ_8

01

001

41

49

51

59

61

69

71

79

[BP+SI]+ смещ_8

01

010

42

4a

52

5a

62

6a

72

7a

[BP+DI]+ смещ_8

01

011

43

4b

53

5b

63

6b

73

7b

[SI]+ смещ_8

01

100

44

4c

54

5c

64

6c

74

7c

Эффективный адрес

mod

r/m

Шестнадцатеричные значения mod г/т

р1]+смещ_8

01

101

45

4d

55

5d

65

6d

75

7d

[ВР]+смещ_8

01

110

46

56

5e

66

6e

76

7e

[ВХ]+смещ_8

01

111

47

4f

57

5f

67

6f

77

7f

[BX+SI]+ смещ_J6

10

000

80

88

90

98

a0

a8

b0

b8

[ВХ+01]+смещ_1б

10

001

81

89

91

99

al

a9

bl

b9

[BP+SI]+ смещ_16

10

010

82

92

9a

a2

aa

b2

ba

[ВР+01]+смещ_16

10

011

83

93

9b

a3

ab

b3

bb

[SI]+ смещ_16

10

100

84

94

9c

a4

ac

b4

be

[Т>1]+смещ_16

10

101

85

8d

95

9d

a5

ad

b5

bd

[ВР]+смещ_16

10

110

86

96

9e

a6

ae

b6

be

[ВХ]+смещ_16

10

111

87

8f

97

9f

a7

af

77

bf

EAX/AX/AL

11

000 .

c0

с8

d0

d8

e0

e8

f0

f8

ECX/CX/CL

11

001

cl

с9

dl

d9

el

e9

fl

f9

EDX/DX/DL

11

010

с2

са

d2

Da

e2

ea

f2

fa

EBX/BX/BL

И

011

сЗ

cb

d3

Db

e3

eb

G

fb

ESP/SP/AH

11

100

с4

ее

d4

DC

e4

ec

f4

fc

ЕВР/ВР/СН

11

101

с5

cd

d5

Dd

e5

ed

fS

fd

ESI/SI/DH

11

110

сб

се

d6

De

e6

ее

f6

fe

EDI/DI/BH

11

111

с7

cf

d7

Df

e7.

ef

f7

ff

Таблица З.6. Значения байта mod r/m (32-разрядная адресация)

r32

ЕАХ

ЕСХ

EDX

ЕВХ

ESP

ЕВР

ESI

EDI

/цифра (код операции)

0

1

2

3

4

5

6

7

reg

000

001

010

011

100

101

110

111

Эффективный адрес

mod

r/m

Шестнадцатеричные значения mod r/m

садцатер

ичные з

начени

modr/i

[ЕАХ]

00

ооо

00

08

10

18

20

28

30

38

[ЕСХ]

00

001

01

09

11

19

21

29

31

39

[EDX]

00

010

02

12

22

32

За

[ЕВХ]

00

011

03

0b

13

1b

23

2b

33

3b

[sib]

00

100

04

14

24

34

Зс

Смещ_32

00

101

05

0d

15

1d

25

2d

35

3d

[ESI]

00

110

06

16

26

36

Зе

[EDI]

00

111

07

0f

17

1f

27

2f

37

3f

[ЕАХ]+смещ_8

01

000

40

48

50

58

60

68

70

78

[ЕСХ]+смещ_8

01

001

41

49

51

59

61

69

71

79

[EDX]+ смещ_8

01

010

42

52

62

72

Эффективный адрес

mod

r/m

Шестнадцатеричные значения mod r/m

[ЕВХ]+смещ_8

01

011

43

4b

53

5b

63

6b

73

7b

[sib]+смещ 8

01

100

44

54

5c

64

6c

74

7c

[ЕВР]+смещ_8

01

101

45

4d

55

5d

65

6d

75

7d

[ESI]+ смещ_8

01

110

46

56

5e

66

6e

76

7e

[ЕШ]+смещ_8

01

111

47

4f .

57

5f

67

6f

77

7f

[ЕАХ]+смещ_32

10

000

80

88

90

98

a0

a8

b0

b8

[ЕСХ]+смещ_32

10

001

81

89

91

99

al

a9

bl

b9

[EDX]+ смещ_2

10

010

82

92

9a

a2

aa

b2

ba

[ЕВХ]+смещ_32

10

011

83

8b

93

9b

a3

ab

b3

bb

[SIB]

10

100

84

94

9c

a4

ac

Ъ4

be

[ЕВР]+смещ_32

10

101

85

8d

95

9d

a5

ad

b5

bd

[ESI]+ смещ_32

10

110

86

96

9e

a6

ae

b6

be

[Е01]+смещ_32

10

111

87

8f

97

9f

a7

af

77

bf

EAX/AX/AL

11

000

c0

С8

d0

d8

e0

e8

f0

re

ECX/CX/CL

11

001

cl

С9

dl

d9

el

e9

fl

f9

EDX/DX/DL

11

010

с2

са

d2

Da

e2

ea

f2

fa

EBX/BX/BL

11

011

сЗ

cb

d3

Db

e3

eb

f3

ft

ESP/SP/AH

11

100

с4

cc

d4

DC

e4

ec

f4

fc

ЕВР/ВР/СН

11

10.1

с5

cd

d5

Dd

e5

ed

f5

fd

ESI/SI/DH

11

110

c6

се

d6

De

e6

ее

f6

fe

EDI/DI/BH

11

111

с7

cf

d7

Df

e7

ef

f7

ff

Рассмотрим пример использования данных таблиц при значении байта mod r/m равном 87h. Для восстановления местонахождения операндов данной машинной команды следует найти это значение в одной из таблиц (какой таблицей воспользоваться, зависит от текущего режима адресации) и по первому столбцу строки, содержащей код 87h, определить местонахождение первого операнда. В нашем случае адрес операнда формируется из содержимого регистра ВХ и 16-разрядного смещения, значение которого следует искать в следующих за байтом mod r/m двух байтах. Второй столбец той же строки содержит значение поля mod. Третье поле байта mod r/m можно найти, переместившись вверх по столбцу, содержащему значение 87h, до пересечения со строкой reg или /цифра. При этом будет выбрано значение, идентифицирующее один из регистров или продолжение кода операции. Что именно определяется либо самим кодом операции, либо значением бита w в сочетании с текущей разрядностью адреса (см. ранее).

При использовании 32-разрядной адресации содержимое байта mod r/m трактуется несколько иначе из-за наличия в формате машинной команды байта sib.

Некоторые машинные команды могут работать с сегментными регистрами. Далее приведены соглашения по кодированию сегментных регистров. В дальнейшем изложении будем различать два набора регистров:

-sreg86 - сегментные регистры, существовавшие в архитектуре процессоров 18086/88 и i80286;

- sreg386 - сегментные регистры архитектуры процессоров i80386 и выше.

Различие наборов состоит в том, что кодируются они различным количеством битов: sreg86 -двумя битами (табл. 3.7), a sreg386 -тремя (табл. 3.8).

Таблица 3.7. Кодировка сегментных регистров в наборе sreg86

Код в поле sreg86

Сегментный регистр

00

ES

01

CS

10

SS

11

DS

Таблица 3.8. Кодировка сегментных регистров в наборе sreg386

Код в поле sreg86

Сегментный регистр

000

ES

001

CS

010

SS

011

DS

100

FS

101 GS

Одна из целочисленных команд - команда MOV-может оперировать системными регистрами. Кодировка этих регистров приведена в табл. 3.9.

Таблица 3.9. Кодировка системных регистров в команде MOV

Код в поле creg

Регистры управления

Регистры отладки

000

CR0

DR0

001

-

DR1

010

CR2

DR2

011

CR3

DR3

100

CR4

-

101

-

-

110

-

DR6

111

-

DR7

Соседние файлы в папке Лекция 1