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

Dos7book

.pdf
Скачиваний:
76
Добавлен:
09.02.2015
Размер:
5.1 Mб
Скачать

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

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