Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
97
Добавлен:
09.02.2015
Размер:
5 Мб
Скачать
☆

Глава 7: Ассемблерные команды отладчика Debug.exe

7.04-32 FISUBR – обратное вычитание целого

Команда FISUBR (Integer SUBtract in Reverse order) выполняет вычитание действительного числа, находящегося в верхнем регистре ST(0) стека сопроцессора, из целого числа – уменьшаемого, считываемого из ячейки памяти. Получаемая разность замещает вычитаемое в регистре ST(0).

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

 

DA

(2,6,A)(8-F)

0-2

FISUBR

dword ptr [bp+si+ffff]

DE

(2,6,A)(8-F)

0-2

FISUBR

word ptr [bp+si+ffff]

7.04-33 FLD – загрузка действительного числа

Команда FLD (LoaDing) загружает действительное число, считываемое из ячейки памяти или из регистра стека сопроцессора, в регистр ST(7), который должен быть пуст, а затем уменьшает на единицу указатель вершины стека, вследствие чего регистры ST(0-6) переименовываются в ST(1-7), а регистр ST(7) – в ST(0), так что загруженное число оказывается в верхнем регистре ST(0).

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D9

(0,4,8)(0-7)

0-2

FLD dword ptr [bp+si+ffff]

D9

C(0-7)

 

FLD ST(0-7)

DB

(2,6,A)(8-F)

0-2

FLD tbyte ptr [bp+si+ffff]

DD

(0,4,8)(0-7)

0-2

FLD qword ptr [bp+si+ffff]

7.04-34 FLD1 – загрузка единичной константы

Команда FLD1 (LoaD 1) загружает константу 1.0 в регистр стека ST(7), который должен быть пуст, а затем уменьшает на единицу указатель вершины стека, вследствие чего регистры ST(0-6) переименовываются в ST(1-7), а регистр ST(7) – в ST(0), так что загруженная константа оказывается в верхнем регистре ST(0).

Код

Пример

D9 E8

FLD1

7.04-35 FLDCW – загрузка регистра CWR

Команда FLDCW (LoaD Control Word) копирует слово данных, сохраненное командой FSTCW (7.04-55), из указанного адреса памяти в служебный регистр

– 319 –

Глава 7: Ассемблерные команды отладчика Debug.exe

CWR (Control Word Register). Если слово было изменено, то после копирования командой FLDCW внесенные изменения вступят в силу.

1-й байт

2-й байт

Байты

Пример

данных

 

 

 

D9

(2,6,A)(8-F)

0-2

FLDCW word ptr [bp+si+ffff]

Примечание 1: биты 0 – 5 регистра CWR играют роль масок для флагов ошибок, представленных соответствующими битами 0 – 5 регистра SWR (7.04-08). Начальное состояние масок – установленное, но если маску сбросить, то возникновение ошибки повлечет запрос IRQ 13 на вызов обработчика прерывания INT 75 (8.03-75), который должен быть способен справиться с возникшей проблемой.

Примечание 2: биты 9 и 8 регистра CWR – это поле задания точности (Precision Control Field). Начальное состояние 11 означает 10-байтовый формат чисел, состояние 10 – округление до 8-байтового формата, состояние 00 – округление до 4-байтового формата (7.04-05). Однако понижение точности не ускоряет исполнение операций.

7.04-36 FLDENV – загрузка служебных регистров

Команда FLDENV (LoaD ENVironment) восстанавливает состояния всех служебных регистров арифметического сопроцессора (CWR, SWR, TWR, IPR, DPR) по записи, которую считывает из памяти, начиная с указанного адреса. Эта запись должна быть заранее сформирована командой FSTENV (7.04-56).

 

1-й байт

 

2-й байт

Байты

Пример

 

 

данных

 

 

 

 

 

 

D9

 

(2,6,A)(0-7)

0-2

FLDENV word ptr [bp+si+ffff]

7.04-37

FLDL2E – загрузка константы log e

Команда FLDL2E (LoaD Log2E) загружает константу log e = 1.44269..., то есть логарифм числа e = 2.71828... по основанию 2, в регистр стека ST(7), который должен быть пуст, а затем уменьшает на единицу указатель вершины стека, вследствие чего регистры ST(0-6) переименовываются в ST(1-7), а регистр ST(7) – в ST(0), так что загруженная константа оказывается в верхнем регистре ST(0).

Код

 

Пример

D9 EA

 

FLDL2E

 

– 320 –

Глава 7: Ассемблерные команды отладчика Debug.exe

7.04-38 FLDL2T – загрузка константы log10

Команда FLDL2T (LoaD Log2 of Ten) загружает константу log10 = 3.32192..., то есть логарифм числа 10 по основанию 2, в регистр стека ST(7), который должен быть пуст, а затем уменьшает на единицу указатель вершины стека, вследствие чего регистры ST(0-6) переименовываются в ST(1-7), а регистр ST(7) – в ST(0), так что загруженная константа оказывается в верхнем регистре ST(0).

Код

Пример

D9 E9

FLDL2T

7.04-39 FLDLG2 – загрузка константы lg2

Команда FLDLG2 (LoaD Lg2) загружает константу lg2 = 0.301029..., то есть логарифм числа 2 по основанию 10, в регистр стека ST(7), который должен быть пуст, а затем уменьшает на единицу указатель вершины стека, вследствие чего регистры ST(0-6) переименовываются в ST(1-7), а регистр ST(7) – в ST(0), так что загруженная константа оказывается в верхнем регистре ST(0).

Код

Пример

D9 EC

FLDLG2

7.04-40 FLDLN2 – загрузка константы ln2

Команда FLDLN2 (LoaD LN2) загружает константу ln2 = 0.693147..., то есть логарифм числа 2 по основанию e = 2.71828..., в регистр стека ST(7), который должен быть пуст, а затем уменьшает на единицу указатель вершины стека, вследствие чего регистры ST(0-6) переименовываются в ST(1-7), а регистр ST(7) – в ST(0), так что загруженная константа оказывается в верхнем регистре ST(0).

Код

Пример

D9 ED

FLDLN2

7.04-41 FLDPI – загрузка константы "PI"

Команда FLDPI (LoaD PI) загружает константу PI = 3.14159… в регистр стека ST(7), который должен быть пуст, а затем уменьшает на единицу указатель вершины стека, вследствие чего регистры ST(0-6) переименовываются в ST(1-7), а регистр ST(7) – в ST(0), так что загруженная константа оказывается в верхнем регистре ST(0).

– 321 –

Глава 7: Ассемблерные команды отладчика Debug.exe

 

 

Код

Пример

 

 

D9 EB

FLDPI

7.04-42

FLDZ – загрузка константы нуль

Команда FLDZ (LoaD Zero) загружает константу 0 в регистр стека ST(7), который должен быть пуст, а затем уменьшает на единицу указатель вершины стека, вследствие чего регистры ST(0-6) переименовываются в ST(1-7), а регистр ST(7) – в ST(0), так что загруженная константа оказывается в верхнем регистре

ST(0).

 

Код

Пример

 

D9 EE

FLDZ

7.04-43 FMUL – умножение

 

Команда FMUL (MULtiply) умножает действительное число в верхнем регистре ST(0) стека сопроцессора или в не-верхнем регистре стека, если он указан в качестве первого операнда, на другое действительное число – множитель, считываемое из ячейки памяти или из регистра стека ST(0-7), если он указан в качестве второго операнда. Получаемое произведение замещает собою прежнее содержимое регистра ST(0) или другого регистра ST(1-7), если он указан в качестве первого операнда.

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D8

(0,4,8)(8-F)

0-2

FMUL dword ptr [bp+si+ffff]

D8

C(8-F)

 

FMUL ST,ST(0-7)

DC

(0,4,8)(8-F)

0-2

FMUL qword ptr [bp+si+ffff]

DC

C(8-F)

 

FMUL ST(1-7),ST

7.04-44 FMULP – умножение и выталкивание

Команда FMULP (MULtiply and Pop) умножает действительное число в не-верхнем регистре стека сопроцессора на другое действительное число, находящееся в верхнем регистре ST(0), записывает результат в регистр ST(1-7) вместо первого сомножителя, а затем увеличивает указатель вершины стека на единицу, так что доступ к прежнему числу в регистре ST(0) утрачивается, а номера

– 322 –

Глава 7: Ассемблерные команды отладчика Debug.exe

всех других регистров стека, включая тот, в который записано полученное произведение, уменьшаются на единицу.

 

 

Код

Пример

 

 

DE С(8-F)

FMULP ST(1-7),ST

7.04-45

FNOP – "пустая" операция

 

Команда FNOP (No Operation) никаких действий не выполняет, лишь увеличивает число в регистре IP – указателе команд – на 2 (потому что код самой команды FNOP занимает 2 байта).

 

 

Код

Пример

 

 

D9 D0

FNOP

7.04-46

FPATAN – частичный арктангенс

Команда FPATAN (Partial ArcTANgent) делит положительное действительное число в верхнем регистре стека ST(0) на не меньшее положительное действительное число в регистре стека ST(1), вычисляет функцию Arctg(ST(0)/ST(1)) в радианах, записывает результат в регистр ST(1), а затем увеличивает указатель вершины стека на единицу, так что регистр ST(1), куда был записан результат, становится регистром ST(0), а доступ к прежнему содержимому регистра ST(0) утрачивается.

Код

Пример

D9 F3

FPATAN

7.04-47 FPREM – вычисление частичного остатка

Основное назначение команда FPREM (Partial REMainder) – приведение

аргумента периодических тригонометрических функций в рамки начального интервала. Команда FPREM выполняет деление числа в верхнем регистре стека сопроцессора ST(0) на другое число – делитель – в регистре ST(1). Получаемый остаток замещает делимое в регистре ST(0). Если этот остаток оказывается больше, чем делитель в регистре ST(1), то результат считается частичным остатком и отмечается установлением бита C2=1 в регистре SWR. В таком случае команду FPREM следует исполнять повторно до тех пор, пока сброс в нуль бита C2 в регистре SWR не засвидетельствует получение конечного остатка.

– 323 –

Глава 7: Ассемблерные команды отладчика Debug.exe

Когда конечный остаток получен, состояния битов С3, С1 и С0 в регистре SWR указывают на тот из 8 секторов круга, в котором находится конечное значение аргумента периодической тригонометрической функции. О том, как проверять состояния битов С3 – С0, написано в 7.04-64.

 

 

Код

Пример

 

 

D9 F8

FPREM

7.04-48

FPTAN – частичный тангенс

 

Команда FPTAN (Partial TANgent) принимает в верхнем регистре стека ST(0) значение углового аргумента в радианах для вычисления тангенса Tg(ST(0)). Сначала указатель вершины стека уменьшается на единицу, так что заданный аргумент оказывается в регистре ST(1), затем производится вычисление тангенса, результат замещает прежнее значение аргумента в регистре ST(1), а в регистр ST(0) загружается константа 1.0. Успешное завершение отмечается сбросом в нуль бита C2 в регистре SWR.

Код

Пример

D9 F2

FPTAN

Примечание 1: указатель вершины стека будет уменьшен только если регистр ST(7) пуст, иначе команда FPTAN не будет исполнена.

Примечание 2: при использовании старых моделей арифметических сопроцессоров (до 80287 включительно) аргумент команды FPTAN должен быть в пределах от 0 до PI/4.

7.04-49 FRNDINT – округление числа

Команда FRNDINT (RouND to INTeger) преобразует действительное значение в верхнем регистре стека сопроцессора ST(0) в целое число посредством округления. Характер исполнения округления определяется двухбитовым полем RC (Rounding Control) в регистре CWR: при RC=00 производится округление до ближайшего целого числа, при RC=01 – округление вниз до ближайшего меньшего целого числа, при RC=10 – округление вверх до ближайшего большего целого числа, а при RC=11 – округление путем отбрасывания дробной части числа.

Код

Пример

D9 FC

FRNDINT

– 324 –

Глава 7: Ассемблерные команды отладчика Debug.exe

Примечание 1: поле RC – это биты 11 и 10 регистра CWR, их состояние можно записать в память командой FSTCW (7.04-55), изменить, а потом ввести в обратно в регистр CWR командой FLDCW (7.04-35).

7.04-50 FRSTOR – восстановить состояние сопроцессора

Команда FRSTOR (ReSTORe) восстанавливает полное состояние арифметического сопроцессора, включая состояния регистров стека и всех управляющих регистров, по записи длиной 96 или 108 байт, заранее заготовленной при помощи команды FSAVE (7.04-51). Операндом команды FRSTOR является адрес первого байта этой записи, причем длина записи определяется автоматически по режиму работы компьютера: реальному или защищенному. Поэтому важно, чтобы восстановление происходило в том же режиме, в котором производилась запись.

 

1-й байт

 

2-й байт

Байты

Пример

 

 

данных

 

 

 

 

 

 

DD

 

(2,6,A)(0-7)

0-2

FRSTOR [bp+si+ffff]

7.04-51

FSAVE – сохранить состояние сопроцессора

Команда FSAVE записывает в память компьютера, начиная с указанного адреса, состояния регистров стека и всех управляющих регистров арифметического сопроцессора, а затем приводит управляющие регистры сопроцессора в исходное состояние так же, как это делает команда FINIT (7.04-28). Формируемая командой FSAVE запись длиной 96 или 108 байт позволяет впоследствии восстановить состояние сопроцессора командой FRSTOR (7.04-50).

 

1-й байт

 

2-й байт

Байты

Пример

 

 

данных

 

 

 

 

 

 

DD

 

(3,7,B)(0-7)

0-2

FSAVE [bp+si+ffff]

7.04-52

FSCALE – умножение на степень числа 2

Команда FSCALE умножает действительное число в верхнем регистре сопроцессора ST(0) на число 2, возведенное в степень с целочисленным показателем, положительным или отрицательным. Если показатель степени, считываемый из регистра стека ST(1), не является целым числом, то перед

возведением в степень производится его округление вниз до ближайшего меньшего целого числа. Результат умножения замещает первый сомножитель в регистре

ST(0).

– 325 –

Глава 7: Ассемблерные команды отладчика Debug.exe

 

 

Код

Пример

 

 

D9 FD

FSCALE

7.04-53

FSQRT – квадратный корень

 

Команда FSQRT (SQuare RooT) вычисляет квадратный корень из положительного действительного числа в верхнем регистре ST(0) стека сопроцессора. Получаемый результат замещает собою операнд в регистре ST(0).

 

 

Код

Пример

 

 

D9 FA

FSQRT

7.04-54

FST – сохранить число

 

Команда FST (STore) копирует действительное число из верхнего регистра ST(0) стека сопроцессора в какой-либо другой регистр стека ST(1-7) или в ячейку памяти согласно указанному формату и адресу. Число, записываемое в память, подвергается округлению, если указанный в команде формат меньше, чем 10-байтовый формат регистра ST(0).

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D9

(1,5,9)(0-7)

0-2

FST dword ptr [bp+si+ffff]

DD

(1,5,9)(0-7)

0-2

FST qword ptr [bp+si+ffff]

DD

D(0-7)

 

FST ST(1-7)

Примечание 1: отладчик DEBUG.EXE ошибочно дизассемблирует как команду FST

код "DF D(0-7)".

Примечание 2: команда FST позволяет осуществлять копирование в занятый регистр стека с замещением прежнего содержимого этого регистра.

7.04-55 FSTCW – сохранение регистра CWR

Команда FSTCW (STore Control Word) записывает в память по указанному адресу слово данных, копирующее все биты управляющего регистра CWR.

1-й байт

2-й байт

Байты

Пример

данных

 

 

 

D9

(3,7,B)(8-F)

0-2

FSTCW [bp+si+ffff]

– 326 –

Глава 7: Ассемблерные команды отладчика Debug.exe

Примечание 1: восстановление состояния регистра CWR по сохраненному в памяти слову данных осуществляется командой FLDCW (7.04-35).

7.04-56 FSTENV – сохранение служебных регистров

Команда FSTENV записывает в память, начиная с указанного адреса, состояния всех служебных регистров сопроцессора: CWR (Control Word Register), SWR (Status Word Register), TWR (Tags Word Register), IPR (Instruction Pointer Register), DPR (Data Pointer Register). В отличие от команды FSAVE, команда FSTENV не

приводит регистры сопроцессора в начальное состояние и не сохраняет содержимое регистров стека.

Данные из записи, сформированной командой FSTENV, могут быть загружены обратно в служебные регистры сопроцессора командой FLDENV (7.04-36).

1-й байт

2-й байт

Байты

Пример

данных

 

 

 

D9

(3,7,B)(0-7)

0-2

FSTENV [bp+si+ffff]

7.04-57 FSTP – сохранение числа и выталкивание

Команда FSTP (STore and Pop) копирует действительное число из верхнего регистра ST(0) стека сопроцессора в память по указанному адресу или в любой другой регистр стека ST(1-7), а затем увеличивает указатель вершины стека на единицу, так что доступ к прежнему числу в регистре ST(0) утрачивается, а номера всех других регистров стека становятся на единицу меньше. Допустима запись в непустой регистр стека, прежнее содержимое которого утрачивается. Число, записываемое в память, подвергается округлению, если указанный в команде формат меньше, чем 10-байтовый формат регистра ST(0).

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D9

(1,5,9)(8-F)

0-2

FSTP dword ptr [bp+si+ffff]

DB

(3,7,B)(8-F)

0-2

FSTP tbyte ptr [bp+si+ffff]

DD

(1,5,9)(8-F)

0-2

FSTP qword ptr [bp+si+ffff]

DD

D(8-F)

 

FSTP ST(1-7)

Примечание 1: отладчик DEBUG.EXE ошибочно дизассемблирует как команду

FSTP коды "D9 D(8-F)" и "DF D(8-F)".

– 327 –

Глава 7: Ассемблерные команды отладчика Debug.exe

7.04-58 FSTSW – копирование регистра SWR

Команда FSTSW копирует в указанный адрес состояние служебного регистра SWR (Status Word Register) арифметического сопроцессора, преимущественно в целях анализа результатов после исполнения сравнений. О расположении флагов в регистре SWR написано в 7.04-08 и 7.04-64.

1-й байт

2-й байт

Байты

Примеры

Примечание

данных

 

 

 

 

DD

(3,7,B)(8-F)

0-2

FSTSW [bp+si+ffff]

 

DF

E0

 

ESC 3C,AL

*1

Примечание 1: процессоры не древнее 80486 исполняют команду FSTSW AX, которая копирует регистр SWR в регистр AX, но отладчик DEBUG.EXE "знает" только ее первоначальное название ESC 3C,AL.

7.04-59 FSUB – вычитание действительных чисел

Команда FSUB (SUBtract) вычитает действительное число, считываемое из ячейки памяти или из любого регистра сопроцессора, если он указан в качестве второго операнда, из другого действительного числа, находящегося в верхнем регистре ST(0) стека сопроцессора или в другом регистре стека ST(1-7), если он указан в качестве первого операнда. Результат замещает собою уменьшаемое в регистре ST(0) или в другом регистре стека ST(1-7), если он указан в качестве первого операнда.

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D8

(2,6,A)(0-7)

0-2

FSUB dword ptr [bp+si+ffff]

D8

E(8-F)

 

FSUB ST,ST(0-7)

DC

(2,6,A)(0-7)

0-2

FSUB qword ptr [bp+si+ffff]

DC

E(8-F)

 

FSUB ST(1-7),ST

7.04-60 FSUBP – вычитание и выталкивание

Команда FSUBP (SUBtract and Pop) вычитает действительное число, находящееся в верхнем регистре ST(0) стека сопроцессора, из другого действительного числа в другом регистре стека ST(1-7), замещает там уменьшаемое полученной разностью, а затем увеличивает указатель вершины стека на единицу, так что доступ к прежнему числу в регистре ST(0) утрачивается, а номера всех

– 328 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]