Dos7book
.pdf
Глава 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 –
