Dos7book
.pdfГлава 7: Ассемблерные команды отладчика Debug.exe
собою прежнее значение в регистре ST(0) или в другом регистре стека сопроцессора, если такой регистр ST(1-7) указан первым из двух операндов.
1-й байт |
2-й байт |
Байты |
Примеры |
|
данных |
||||
|
|
|
||
D8 |
(0,4,8)(0-7) |
0-2 |
FADD dword ptr [bp+si+ffff] |
|
D8 |
C(0-7) |
|
FADD ST,ST(0-7) |
|
DC |
(0,4,8)(0-7) |
0-2 |
FADD qword ptr [bp+si+ffff] |
|
DC |
C(0-7) |
|
FADD ST(1-7),ST |
7.04-04 FADDP – сложение и выталкивание
Команда FADDP (ADD and Pop) суммирует число, находящееся в верхнем регистре ST(0) стека сопроцессора, с числом, находящимся в одном из других регистров ST(1-7) того же стека. Туда же помещается получаемая сумма, а затем указатель вершины стека увеличивается на единицу, так что доступ к прежнему числу в регистре ST(0) утрачивается, а номера регистров ST(1-7), включая тот, куда помещена полученная сумма, становятся на единицу меньше.
|
|
Код |
Пример |
|
|
DE C(0-7) |
FADDP ST(1-7),ST |
7.04-05 |
FBLD – загрузка с преобразованием |
Команда FBLD (Binary LoaD) считывает из памяти, начиная с указанного адреса, целое 10-байтовое упакованное десятичное число, содержащее по две десятичные цифры на байт, преобразует его в формат двоичного действительного числа, и в таком виде загружает в регистр ST(7), который должен быть пуст, а затем уменьшает указатель вершины стека на единицу, вследствие чего регистры ST(0-6) переименовываются в ST(1-7), а регистр ST(7) – в ST(0), так что загруженное число оказывается в верхнем регистре ST(0).
1-й байт |
2-й байт |
Байты |
Пример |
|
данных |
||||
|
|
|
||
DF |
(2,6,A)(0-7) |
0-2 |
FBLD tbyte ptr [bp+si+ffff] |
Примечание 1: команда FBLD не проверяет, содержит ли считываемое из памяти число только десятичные цифры или нет. Если нет, то результат преобразования будет ошибочным.
Примечание 2: 10-байтовый формат двоичного действительного числа, с которым по умолчанию работает арифметический сопроцессор, включает
– 309 –
Глава 7: Ассемблерные команды отладчика Debug.exe
мантиссу (биты 0 – 63), показатель степени (биты 64 – 78) и знаковый бит 79. Путем изменения содержания поля PC (7.04-35, примечание 2) возможно переключение в 8-байтовый формат двойной точности (52 бита – мантисса, 11 бит – степень) и в 4-байтовый формат одинарной точности (23 байта мантисса, 8 бит
– степень).
7.04-06 FBSTP – выгрузка с преобразованием
Команда FBSTP (Binary STore and Pop) преобразует двоичное действительное число в верхнем регистре ST(0) стека сопроцессора в целое 10-байтовое упакованное десятичное число, содержащее по две десятичных цифры на байт. Преобразование включает округление дробной части числа. В таком виде команда FBSTP копирует число в память, начиная с указанного адреса, а затем увеличивает указатель вершины стека на единицу, так что доступ к прежнему числу в регистре ST(0) утрачивается, а регистры ST(1-7) переименовываются в ST(0-6).
1-й байт |
2-й байт |
Байты |
Пример |
|
данных |
||||
|
|
|
||
DF |
(3,7,B)(0-7) |
0-2 |
FBSTP tbyte ptr [bp+si+ffff] |
7.04-07 FCHS – изменить знак
Команда FCHS (CHange Sign) изменяет на противоположный знак числа в верхнем регистре ST(0) стека арифметического сопроцессора.
Код |
Пример |
D9 E0 |
FCHS |
7.04-08 FCLEX – сброс флагов ошибок
Команда FCLEX (CLear EXeptions) сбрасывает в служебном регистре SWR (Status Word Register) арифметического сопроцессора следующие флаги:
бит 0 – флаг недействительной операции бит 1 – флаг денормализованного операнда бит 2 – флаг деления на нуль бит 3 – флаг переполнения
бит 4 – флаг антипереполнения (потери результата) бит 5 – флаг потери точности бит 7 – флаг запроса прерывания
бит 15 – флаг занятости сопроцессора
– 310 –
Глава 7: Ассемблерные команды отладчика Debug.exe
|
Код |
Пример |
|
DB E2 |
FCLEX |
7.04-09 FCOM – сравнение чисел |
|
Команда FCOM (COMpare) сравнивает действительное число в верхнем регистре ST(0) стека сопроцессора с содержимым указанного регистра или ячейки памяти. Флаги C0, C2 и C3 регистра SWR приводятся в соответствие с результатом сравнения. Сначала надо проверять C2: если C2 = 1, то операнды несопоставимы, и дальше проверять нечего. C3 = 1 отмечает равенство, а C0 = 1 означает, что число в регистре ST(0) меньше, чем другой операнд. О том, как проверять состояния флагов C0 – C3 регистра SWR, написано в разделе 7.04-64.
1-й байт |
2-й байт |
Байты |
Примеры |
|
данных |
||||
|
|
|
||
D8 |
(1,5,9)(0-7) |
0-2 |
FCOM dword ptr [bp+si+ffff] |
|
D8 |
D(0-7) |
|
FCOM ST(0-7) |
|
DC |
(1,5,9)(0-7) |
0-2 |
FCOM qword ptr [bp+si+ffff] |
Примечание 1: отладчик DEBUG.EXE ошибочно дизассемблирует код "DC D(0-7)"
как команду FCOM ST(0-7).
7.04-10 FCOMP – сравнение и выталкивание
Команда FCOMP (COMpare and Pop) выполняет сравнение чисел точно так же, как это делает команда FCOM (7.04-09), но потом увеличивает указатель вершины стека на единицу, так что доступ к прежнему содержимому верхнего регистра ST(0) утрачивается, а регистры стека ST(1-7) переименовываются в ST(0-6).
1-й байт |
2-й байт |
Байты |
Примеры |
|
данных |
||||
|
|
|
||
D8 |
(1,5,9)(8-F) |
0-2 |
FCOMP dword ptr [bp+si+ffff] |
|
D8 |
D(8-F) |
|
FCOMP ST(0-7) |
|
DC |
(1,5,9)(8-F) |
0-2 |
FCOMP qword ptr [bp+si+ffff] |
Примечание 1: отладчик DEBUG.EXE ошибочно дизассемблирует как команду
FCOMP коды "DC D(8-F)" и "DE D(0-7)".
– 311 –
Глава 7: Ассемблерные команды отладчика Debug.exe
7.04-11 FCOMPP – сравнение и 2 выталкивания
Команда FCOMPP (COMpare and Pop and Pop) сравнивает операнды в регистрах стека сопроцессора ST(0) и ST(1), а затем увеличивает указатель вершины стека на 2, так что оба операнда оказываются утрачены, а регистры стека ST(2-7) переименовываются в ST(0-5).
Результат сравнения выражается состояниями флагов C0, C2 и C3 служебного регистра SWR точно так же, как после исполнения команды FCOM (7.04-09).
Код |
Пример |
DE D9 |
FCOMPP |
Примечание 1: отладчик DEBUG.EXE дизассемблирует код "DE D9" как команду "FCOMPP ST(1)", но при ассемблировании не принимает "ST(1)".
7.04-12 FDECSTP – уменьшить указатель вершины стека
Уменьшение указателя вершины стека на единицу командой FDECSTP (DECrement Stack Top Pointer) изменяет нумерацию регистров стека сопроцессора: регистр ST(7) становится регистром ST(0), а номера регистров ST(0-6) увеличиваются на единицу и становятся ST(1-7). Содержимое регистров стека сохраняется.
Код |
Пример |
D9 F6 |
FDECSTP |
Примечание 1: указатель стека представляет собой трехразрядный реверсивный счетчик на базе битов 11, 12 и 13 служебного регистра SWR.
Примечание 2: команды записи в регистр ST(0) с "проталкиванием" стека вниз исполняются путем записи в регистр ST(7) и переименования его в ST(0) уменьшением указателя вершины стека. Такие команды не исполняются, если регистр ST(7) не пуст.
7.04-13 FDISI – запретить прерывания
Команда FDISI (DISable Interrupts) – команда запрета прерываний для старого арифметического сопроцессора 8087. Начиная с модели 80287 сопроцессоры не нуждаются в этой команде и игнорируют ее.
Код |
Пример |
DB E1 |
FDISI |
– 312 –
Глава 7: Ассемблерные команды отладчика Debug.exe
7.04-14 FDIV – деление
Команда FDIV (DIVide) делит действительное число в верхнем регистре ST(0) стека сопроцессора или в другом регистре ST(1-7) стека, если он указан в качестве первого операнда, на действительное число в ячейке памяти или в регистре стека сопроцессора, если он указан в качестве второго операнда. Результат замещает делимое в регистре ST(0) или в каком-либо из регистров ST(1-7), если он указан в качестве первого операнда.
1-й байт |
2-й байт |
Байты |
Пример |
|
данных |
||||
|
|
|
||
D8 |
(3,7,B)(0-7) |
0-2 |
FDIV dword ptr [bp+si+ffff] |
|
D8 |
F(0-7) |
|
FDIV ST,ST(0-7) |
|
DC |
(3,7,B)(0-7) |
0-2 |
FDIV qword ptr [bp+si+ffff] |
|
DC |
F(8-F) |
|
FDIV ST(1-7),ST |
7.04-15 FDIVP – деление и выталкивание.
Команда FDIVP (DIVide and Pop) делит число, находящееся в не-верхнем регистре ST(1-7) стека сопроцессора, на делитель в верхнем регистре стека ST(0), замещает делимое результатом в регистре ST(1-7), а затем увеличивает указатель вершины стека на единицу, так что доступ к делителю в верхнем регистре ST(0) утрачивается, а номера регистров ST(1-7), включая тот, в который помещено полученное частное, уменьшаются на единицу.
Код |
Пример |
DE F(8-F) |
FDIVP ST(1-7),ST |
7.04-16 FDIVR – деление в обратном порядке
Команда FDIVR (DIVide in Reverse order) делит действительное число, считываемое из ячейки памяти или из регистра стека сопроцессора, если он указан в качестве второго операнда, на делитель, находящийся в верхнем регистре ST(0) стека сопроцессора или в другом регистре стека ST(1-7), если он указан в качестве первого операнда. Получаемое частное замещает собою делитель в регистре ST(0) или в другом регистре стека ST(1-7), если он указан в качестве первого операнда.
1-й байт |
2-й байт |
Байты |
Примеры |
||
данных |
|||||
|
|
|
|
||
D8 |
(3,7,B)(8-F) |
0-2 |
FDIVR |
dword ptr [bp+si+ffff] |
|
D8 |
F(8-F) |
|
FDIVR |
ST,ST(0-7) |
– 313 –
|
|
Глава 7: |
Ассемблерные команды отладчика Debug.exe |
||||||||
Продолжение таблицы 7.04-16 |
|
|
|
|
|
|
|||||
|
DC |
|
|
(3,7,B)(8-F) |
|
0-2 |
|
FDIVR |
qword ptr [bp+si+ffff] |
|
|
|
|
|
|
|
|||||||
|
DC |
|
|
F(0-7) |
|
|
|
|
FDIVR |
ST(1-7),ST |
|
7.04-17 FDIVRP – обратное деление и выталкивание
Команда FDIVRP (DIVide in Reverse order and Pop) делит действительное число,
находящееся в верхнем регистре ST(0) стека сопроцессора, на делитель, находящийся в другом регистре ST(1-7) стека, замещает делитель в регистре ST(1-7) полученным результатом, а затем увеличивает указатель вершины стека на единицу, так что доступ к прежнему числу в верхнем регистре ST(0) утрачивается, а номера регистров ST(1-7), включая тот, в который помещено полученное частное, уменьшаются на единицу. Например, результат операции FDIVRP ST(6),ST оказывается в регистре ST(5).
Код |
Пример |
DE F(0-7) |
FDIVRP ST(1-7),ST |
7.04-18 FENI – разрешить прерывания
Команда FENI (ENable Interrupts) – команда разрешения прерываний для старого арифметического сопроцессора 8087. Начиная с модели 80287 сопроцессоры не нуждаются в этой команде и игнорируют ее.
|
|
Код |
Пример |
|
|
DB E0 |
FENI |
7.04-19 |
FFREE – освободить регистр |
|
Команда FFREE помечает указанный регистр стека сопроцессора как пустой посредством занесения двоичной метки "11" в тег, соответствующий данному регистру, в регистре тегов TWR.
Код |
Пример |
DD C(0-7) |
FFREE ST(0-7) |
Примечание1: отладчик DEBUG.EXE ошибочно дизассемблирует как команду
FFREE код "DF C(0-7)".
– 314 –
Глава 7: Ассемблерные команды отладчика Debug.exe
7.04-20 FIADD – сложение с целым числом
Команда FIADD (Integer ADDition) выполняет сложение целого числа, считываемого из ячейки памяти, с действительным числом, находящимся в верхнем регистре ST(0) стека сопроцессора. Получаемая сумма замещает второе слагаемое в регистре ST(0).
1-й байт |
2-й байт |
Байты |
Примеры |
||
данных |
|||||
|
|
|
|
||
DA |
(0,4,8)(0-7) |
0-2 |
FIADD |
dword ptr [bp+si+ffff] |
|
DE |
(0,4,8)(0-7) |
0-2 |
FIADD |
word ptr [bp+si+ffff] |
7.04-21 FICOM – сравнение с целым числом
Команда FICOM (Integer COMpare) считывает целое число из ячейки памяти, преобразует его в действительное число и сопоставляет с действительным числом, находящимся в верхнем регистре ST(0) стека сопроцессора. Собственно сопоставление выполняется так же, как это делает команда FCOM (7.04-09).
1-й байт |
2-й байт |
Байты |
Примеры |
||
данных |
|||||
|
|
|
|
||
DA |
(1,5,9)(0-7) |
0-2 |
FICOM |
dword ptr [bp+si+ffff] |
|
DE |
(1,5,9)(0-7) |
0-2 |
FICOM |
word ptr [bp+si+ffff] |
7.04-22 FICOMP – сравнение с целым и выталкивание
Команда FICOMP (Integer COMpare and Pop) считывает целое число из ячейки памяти, преобразует его в действительное число и сопоставляет с действительным числом, находящимся в верхнем регистре ST(0) стека сопроцессора. Собственно сопоставление выполняется так же, как это делает команда FCOM (7.04-09), но затем указатель вершины стека увеличивается на единицу, так что доступ к прежнему операнду в регистре ST(0) оказывается потерян, а регистры ST(1-7) переименовываются в ST(0-6).
1-й байт |
2-й байт |
Байты |
Примеры |
||
данных |
|||||
|
|
|
|
||
DA |
(1,5,9)(8-F) |
0-2 |
FICOMP |
dword ptr [bp+si+ffff] |
|
DE |
(1,5,9)(8-F) |
0-2 |
FICOMP |
word ptr [bp+si+ffff] |
– 315 –
Глава 7: Ассемблерные команды отладчика Debug.exe
7.04-23 FIDIV – деление на целое число
Команда FIDIV (Integer DIVide) делит действительное число в верхнем регистре ST(0) стека сопроцессора на целое число, считываемое из указанной ячейки памяти. Результат замещает делимое в регистре ST(0).
1-й байт |
2-й байт |
Байты |
Примеры |
||
данных |
|||||
|
|
|
|
||
DA |
(3,7,B)(0-7) |
0-2 |
FIDIV |
dword ptr [bp+si+ffff] |
|
DE |
(3,7,B)(0-7) |
0-2 |
FIDIV |
word ptr [bp+si+ffff] |
7.04-24 FIDIVR – обратное деление на целое
Команда FIDIVR (Integer DIVide in Reverse order) выполняет деление числа,
считываемого из ячейки памяти, на делитель, находящийся в верхнем регистре ST(0) стека сопроцессора. Получаемое частное замещает делитель в регистре ST(0).
1-й байт |
2-й байт |
Байты |
Примеры |
||
данных |
|||||
|
|
|
|
||
DA |
(3,7,B)(8-F) |
0-2 |
FIDIVR |
dword ptr [bp+si+ffff] |
|
DE |
(3,7,B)(8-F) |
0-2 |
FIDIVR |
word ptr [bp+si+ffff] |
7.04-25 FILD – загрузка целого числа
Команда FILD (Integer LoaD) загружает содержимое указанных ячеек памяти в регистр ST(7) стека сопроцессора, который должен быть пуст, одновременно преобразуя это содержимое в формат действительного числа, а затем уменьшает указатель вершины стека на единицу, вследствие чего регистры ST(0-6) переименовываются в ST(1-7), а регистр ST(7) – в ST(0), так что загруженное число оказывается в верхнем регистре ST(0).
1-й байт |
2-й байт |
Байты |
Примеры |
|
данных |
||||
|
|
|
||
DB |
(0,4,8)(0-7) |
0-2 |
FILD dword ptr [bp+si+ffff] |
|
DF |
(0,4,8)(0-7) |
0-2 |
FILD word ptr [bp+si+ffff] |
|
DF |
(2,6,A)(8-F) |
0-2 |
FILD qword ptr [bp+si+ffff] |
– 316 –
Глава 7: Ассемблерные команды отладчика Debug.exe
7.04-26 FIMUL – умножение на целое число
Команда FIMUL (Integer MULtiply) умножает действительное число в верхнем регистре ST(0) стека сопроцессора на целое число, считываемое из указанных ячеек памяти. Получаемое произведение замещает первый сомножитель в регистре ST(0).
1-й байт |
2-й байт |
Байты |
Примеры |
||
данных |
|||||
|
|
|
|
||
DA |
(0,4,8)(8-F) |
0-2 |
FIMUL |
dword ptr [bp+si+ffff] |
|
DE |
(0,4,8)(8-F) |
0-2 |
FIMUL |
word ptr [bp+si+ffff] |
7.04-27 FINCSTP – увеличить указатель вершины стека
Увеличение указателя вершины стека на единицу командой FINCSTP (INCrement Stack Top Pointer) изменяет нумерацию регистров стека сопроцессора: регистр ST(0) становится регистром ST(7), а номера регистров ST(1-7) уменьшаются на единицу и становятся ST(0-6). Содержимое регистров стека сохраняется.
Код |
Пример |
D9 F7 |
FINCSTP |
Примечание 1: указатель стека представляет собой трехразрядный реверсивный счетчик на базе битов 11, 12 и 13 служебного регистра SWR.
Примечание 2: при исполнении операции увеличения указателя вершины стека в составе других команд переименование регистра ST(0) в ST(7) сопровождается приданием ему статуса пустого регистра (тега 11). Потому доступ к прежнему содержанию регистра ST(0) утрачивается. Подобные операции часто интерпретируют как "выталкивание" из стека прежнего содержимого регистра ST(0).
7.04-28 FINIT – установ начального состояния
Команда FINIT (INITialize) устанавливает служебные регистры арифметического сопроцессора (CWR, SWR, TWR, IPR, DPR) в начальное состояние. В регистр CWR записывается состояние 037Fh, означающее 80-битовый формат вычислений, маскирование всех исключений и выполнение округления до ближайшего целого числа. В регистр тегов TWR записывается состояние FFFFh, означающее, что все регистры стека сопроцессора пусты. В остальные регистры (SWR, IPR, DPR) записывается исходное состояние 0000h.
– 317 –
Глава 7: Ассемблерные команды отладчика Debug.exe
|
|
Код |
Пример |
|
|
DB E3 |
FINIT |
7.04-29 |
FIST – запись целого числа |
|
Команда FIST (Integer STore) считывает действительное число из верхнего регистра ST(0) стека сопроцессора, преобразует его в целое число, округляя согласно установленному в регистре CWR формату, и записывает в ячейки памяти по указанному адресу.
1-й байт |
2-й байт |
Байты |
Примеры |
||
данных |
|||||
|
|
|
|
||
DB |
(1,5,9)(0-7) |
0-2 |
FIST |
dword ptr [bp+si+ffff] |
|
DF |
(1,5,9)(0-7) |
0-2 |
FIST |
word ptr [bp+si+ffff] |
7.04-30 FISTP – запись целого числа и выталкивание
Команда FISTP (Integer STore and Pop) делает то же самое, что команда FIST (7.04-29), но, кроме того, увеличивает указатель вершины стека на единицу, так что доступ к прежнему содержимому верхнего регистра стека ST(0) утрачивается, а регистры ST(1-7) переименовываются в ST(0-6).
1-й байт |
2-й байт |
Байты |
Примеры |
|
данных |
||||
|
|
|
||
DB |
(1,5,9)(8-F) |
0-2 |
FISTP dword ptr [bp+si+ffff] |
|
DF |
(1,5,9)(8-F) |
|
FISTP word ptr [bp+si+ffff] |
|
DF |
(3,7,B)(8-F) |
0-2 |
FISTP qword ptr [bp+si+ffff] |
7.04-31 FISUB – вычитание целого числа
Команда FISUB (Integer SUBtract) вычитает целое число, считываемое из ячейки памяти, из действительного числа в верхнем регистре ST(0) стека сопроцессора. Получаемая разность замещает уменьшаемое в регистре ST(0).
1-й байт |
2-й байт |
Байты |
Примеры |
||
данных |
|||||
|
|
|
|
||
DA |
(2,6,A)(0-7) |
0-2 |
FISUB |
dword ptr [bp+si+ffff] |
|
DE |
(2,6,A)(0-7) |
0-2 |
FISUB |
word ptr [bp+si+ffff] |
– 318 –