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

Dos7book

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

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

7.03-79 SBB – вычитание с заёмом

Команда SBB (SuBtract with Borrow) вычитает свой второй операнд (вычитаемое) из первого операнда (уменьшаемого), принимая во внимание заем от предшествовавшей операции, выражаемый состоянием флага CF. Затем состояния флагов OF, SF, ZF, AF, PF и CF приводятся в соответствие с получаемой разностью, которая замещает собою первый операнд.

Интерпретация состояний флагов, оставляемых командой SBB, зависит от того, были ли операнды числами со знаком или без знака. После вычитания чисел без знака следует пользоваться командами условных переходов JA, JB, JBE, JNB, а после вычитания чисел со знаком командами JG, JGE, JL, JLE. Полные имена

всех команд условного перехода отражают соотношение между первым операндом (уменьшаемым) и вторым операндом (вычитаемым) команды SBB. Например, JA – переход, если больше означает, что первый операнд должен быть больше второго.

Команда SBB – двоичная операция, но имеются два исключения. Если первый операнд находится в регистре AX, то команда SBB может быть использована для вычитания неупакованных десятичных слов, после чего полученная двоичная

разность должна быть преобразована в неупакованное десятичное слово командой AAS (7.03-04). Если первый операнд находится в регистре AL, то команда SBB может быть применена для вычитания упакованных десятичных байтов; затем

получаемую двоичную разность упакованных десятичных байтов надлежит преобразовать в правильный упакованный десятичный байт командой DAS (7.03-19).

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

18

(0-B)(0-F)

0-2

SBB [bp+si+ffff],bl

18

(C-F)(0-F)

 

SBB bl,bl

19

(0-B)(0-F)

0-2

SBB [bp+si+ffff],bx

19

(C-F)(0-F)

 

SBB bx,bx

1A

(0-B)(0-F)

0-2

SBB bl,[bp+si+ffff]

1B

(0-B)(0-F)

0-2

SBB bx,[bp+si+ffff]

1C

 

1

SBB AL,ff

1D

 

2

SBB AX,ffff

80

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

1-3

SBB byte ptr [bp+si+ffff],ff

80

D(9-F)

1

SBB bl,ff

81

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

2-4

SBB word ptr [bp+si+ffff],ffff

81

D(9-F)

2

SBB bx,ffff

83

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

1-3

SBB word ptr [bp+si+ffff],±7f

83

D(9-F)

1

SBB bx,±7f

– 299 –

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

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

SBB коды "1(A,B) (C-F)(0-F)" и "82 (1,5,9,D)(8-F)". 7.03-80 SCASB – поиск байта

Команда SCASB (SCAn a String of Bytes) сравнивает байт в однобайтовом регистре AL с другим байтом, находящимся в памяти по адресу, который заранее загружен в пару регистров ES:DI. Если байты совпадают, флаг нуля ZF устанавливается в состояние ZR, а иначе он сбрасывается в состояние NZ. После сопоставления смещение в регистре DI увеличивается на единицу или уменьшается на единицу: это зависит от состояния ("UP" или "DN") флага направления DF, которое следует заранее задать командой CLD (счет вверх, 7.03-11) или командой STD (счет вниз, 7.03-85). Устанавливаемые состояния флагов OF, SF, AF, PF и CF соответствуют результату вычитания сопоставляемых байтов, хотя сам этот результат нигде не сохраняется и не отображается.

Перед командой SCASB часто ставится префикс повторения REPNZ (7.02-03) или REPZ (7.02-04), что позволяет исполнять команду SCASB несколько раз и таким образом осуществлять поиск заданного байта в строке байтов. Сегментный регистр ES: посредством префикса смены сегмента заменить нельзя.

Код

Пример

AE

SCASB

Примечание 1: при наличии перед командой SCASB префикса повторения порядок

исполнения операций включает сначала установление флага по результату сравнения байтов, затем изменение смещения в индексном регистре DI, и только потом проверку условия выхода из цикла по состоянию флага. Поэтому смещение в индексном регистре DI в момент выхода из цикла указывает не на тот байт, который удовлетворил условию выхода, а на следующий за ним байт.

7.03-81 SCASW – поиск слова

Команда SCASW (SCAn a String of Words) сравнивает двухбайтовое слово данных в регистре AX с другим словом, находящимся в памяти, и затем изменяет смещение в регистре DI на 2, подготавливая тем самым адрес для сравнения следующего слова. Под действием префикса 66h смены разрядности операнда (7.02-06) команда SCASW сравнивает содержимое регистра EAX с находящимся в памяти четырехбайтовым словом (типа Dword) и изменяет смещение в регистре DI

– 300 –

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

на 4. Все остальные особенности команды SCASW такие же, как у команды SCASB (7.03-80).

 

Код

Пример

 

AF

SCASW

7.03-82 SHL – сдвиг влево

 

Команда SHL (SHift to the Left) выполняет сдвиги своего первого операнда влево. При каждом сдвиге все биты смещаются на одну позицию в сторону старших разрядов, самый старший разряд "выталкивается" во флаг переноса CF, а в самый младший разряд записываются нули. Состояния флагов SF, ZF и PF изменяются соответственно результату. Команда SHL не сохраняет прежние состояния флагов OF и AF, оставляя их в неопределенном состоянии.

Второй операнд (1 или CL) задает количество выполняемых сдвигов влево. Если это количество считывается из регистра CL, то принимаются во внимание только 5 младших бит, следовательно, максимальное количество сдвигов равно 31. Число в регистре CL при исполнении команды SHL не изменяется.

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D0

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

0-2

SHL byte ptr [bp+si+ffff],1

D0

E(0-7)

 

SHL bl,1

D1

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

0-2

SHL word ptr [bp+si+ffff],1

D1

E(0-7)

 

SHL bx,1

D2

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

0-2

SHL byte ptr [bp+si+ffff],CL

D2

E(0-7)

 

SHL bl,CL

D3

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

0-2

SHL word ptr [bp+si+ffff],CL

D3

E(0-7)

 

SHL bx,CL

C0

E(0-7)

1

примечание 2

C1

E(0-7)

1

примечание 2

Примечание 1: команда SHL полностью эквивалентна команде SAL, но отладчик DEBUG.EXE принимает только название SHL.

Примечание 2: часто бывает удобна команда SHL с непосредственным указанием числа сдвигов, введенная начиная с процессора 80286. Отладчик DEBUG.EXE ее "не знает", но позволяет ее вводить как данные с помощью инструкции DB (7.01-01). Например, коды команд сдвига влево на 4 битовых позиции выглядят так:

C0 E0 04

= SHL AL,4

C1 E0 04

= SHL AX,4

– 301 –

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

Последний байт выражает число сдвигов. Для осуществления сдвигов в ином регистре нужно ко второму байту (E0h) прибавить порядковый номер (00h – 07h) желаемого регистра в перечнях, приведенных в 1-й и 2-й строках таблицы 7.00.

7.03-83 SHR – сдвиг вправо

Команда SHR (SHift to the Right) выполняет сдвиги своего первого операнда вправо. При каждом сдвиге все биты смещаются на одну позицию в сторону младших разрядов, самый младший разряд "выталкивается" во флаг переноса CF, а в самый старший разряд записываются нули. Состояния флагов SF, ZF и PF изменяются соответственно результату. Команда SHR не сохраняет прежние состояния флагов OF и AF, оставляя их в неопределенном состоянии.

Второй операнд (1 или CL) задает количество выполняемых сдвигов вправо. Если это количество считывается из регистра CL, то принимаются во внимание только 5 младших бит, следовательно, максимальное количество сдвигов равно 31. Число в регистре CL при исполнении команды SHR не изменяется.

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D0

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

0-2

SHR byte ptr [bp+si+ffff],1

D0

E(8-F)

 

SHR bl,1

D1

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

0-2

SHR word ptr [bp+si+ffff],1

D1

E(8-F)

 

SHR bx,1

D2

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

0-2

SHR byte ptr [bp+si+ffff],CL

D2

E(8-F)

 

SHR bl,CL

D3

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

0-2

SHR word ptr [bp+si+ffff],CL

D3

E(8-F)

 

SHR bx,CL

C0

E(8-F)

1

примечание 1

C1

E(8-F)

1

примечание 1

Примечание 1: часто бывает удобна команда SHR с непосредственным указанием числа сдвигов, введенная начиная с процессора 80286. Отладчик DEBUG.EXE ее "не знает", но позволяет ее вводить как данные с помощью инструкции DB (7.01-01). Например, коды команд сдвига вправо на 4 битовых позиции выглядят так:

C0 E8 04

= SHR AL,4

C1 E8 04

= SHR AX,4

Последний байт выражает число сдвигов. Для осуществления сдвигов в ином регистре нужно ко второму байту (E8h) прибавить порядковый номер (00h – 07h) желаемого регистра в перечнях, приведенных в 1-й и 2-й строках таблицы 7.00.

– 302 –

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

7.03-84 STC – установление флага переноса

Команда STC (SeT Carry flag) устанавливает флаг переноса CF в состояние CY.

Код

Пример

F9

STC

7.03-85 STD – установление флага направления

Команда STD (SeT Direction flag) устанавливает флаг направления DF в состояние DN, при котором смещения в индексных регистрах DI и/или SI в ходе исполнения строковых операций (CMPSB, LODSB, MOVSB, SCASB, STOSB, и

т.д.) будут изменяться в сторону уменьшения.

Код

Пример

FD

STD

7.03-86 STI – установление флага прерывания

Команда STI (SeT Interrupt flag) устанавливает флаг прерывания IF в принимаемое по умолчанию состояние EI (Enable Interrupts), при котором процессор принимает запросы на прерывания через контроллер прерываний.

Код

Пример

FB

STI

Примечание 1: команда STI не выполняется из программ, уровень привилегий которых ниже уровня, установленного для операций ввода-вывода в битах 0Ch и 0Dh регистра флагов (A.11-4).

7.03-87 STOSB – запись байта

Команда STOSB (STOre String of Bytes) копирует байт из однобайтового регистра AL в память по адресу назначения, который заранее подготовлен в регистрах ES:DI. После копирования смещение в регистре DI увеличивается на единицу или уменьшается на единицу: это зависит от состояния ("UP" или "DN") флага направления DF, которое следует заранее задать командой CLD (счет вверх, 7.03-11) или командой STD (счет вниз, 7.03-85). При исполнении команды STOSB состояния всех флагов сохраняются.

– 303 –

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

Перед командой STOSB часто ставится префикс повторения REPNZ (7.02-03) или REPZ (7.02-04), что позволяет исполнять команду STOSB несколько раз и таким образом заполнять заданным байтом строку байтов. Сегментный регистр ES посредством префикса смены сегмента заменить нельзя.

 

Код

Пример

 

AA

STOSB

7.03-88 STOSW – запись слова

 

Команда STOSW (STOre String of Words) копирует двухбайтовое слово из регистра AX в память и затем изменяет смещение в регистре DI на 2, подготавливая тем самым адрес для следующей операции копирования слова. Под действием префикса 66h смены разрядности операнда (7.02-06) команда STOSW копирует в память четырехбайтовое слово (типа Dword) из регистра EAX и изменяет смещение в регистре DI на 4. Все остальные особенности команды

STOSW такие же, как у команды STOSB (7.03-87).

 

Код

Пример

 

AB

STOSW

7.03-89 SUB – вычитание без заема

 

Команда SUB (SUBtract) вычитает второй операнд (вычитаемое) из первого операнда (уменьшаемого), игнорируя состояние флага переноса CF. Затем состояния флагов OF, SF, ZF, AF, PF и CF приводятся в соответствие с получаемой разностью, которая замещает собою первый операнд.

Интерпретация состояний флагов, оставляемых командой SUB, зависит от того, были ли операнды числами со знаком или без знака. После вычитания чисел без знака следует пользоваться командами условных переходов JA, JB, JBE, JNB, а после вычитания чисел со знаком командами JG, JGE, JL, JLE. Полные имена

всех команд условного перехода отражают соотношение между первым операндом (уменьшаемым) и вторым операндом (вычитаемым) команды SUB. Например, JA – переход, если больше означает, что первый операнд должен быть больше второго.

Команда SUB – двоичная операция, но имеются два исключения. Если первый операнд находится в регистре AX, то команда SUB может быть использована для вычитания неупакованных десятичных слов, после чего полученная двоичная

разность должна быть преобразована в неупакованное десятичное слово командой AAS (7.03-04). Если первый операнд находится в регистре AL, то команда SUB

– 304 –

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

может быть применена для вычитания упакованных десятичных байтов; затем

получаемую двоичную разность упакованных десятичных байтов надлежит преобразовать в правильный упакованный десятичный байт командой DAS (7.03-19).

 

1-й байт

2-й байт

Байты

 

Примеры

 

 

данных

 

 

 

 

 

 

 

 

 

28

(0-B)(0-F)

0-2

 

SUB [bp+si+ffff],bl

 

 

28

(C-F)(0-F)

 

 

SUB bl,bl

 

 

29

(0-B)(0-F)

0-2

 

SUB [bp+si+ffff],bx

 

 

29

(C-F)(0-F)

 

 

SUB bx,bx

 

 

2A

(0-B)(0-F)

0-2

 

SUB bl,[bp+si+ffff]

 

 

2B

(0-B)(0-F)

0-2

 

SUB bx,[bp+si+ffff]

 

 

2C

 

1

 

SUB AL,ff

 

 

2D

 

2

 

SUB AX,ffff

 

 

80

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

1-3

 

SUB byte ptr [bp+si+ffff],ff

 

 

80

E(9-F)

1

 

SUB bl,ff

 

 

81

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

2-4

 

SUB word ptr [bp+si+ffff],ffff

 

 

81

E(9-F)

2

 

SUB bx,ffff

 

 

83

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

1-3

 

SUB word ptr [bp+si+ffff],±7f

 

 

83

E(9-F)

1

 

SUB bx,±7f

 

Примечание 1: отладчик DEBUG.EXE

ошибочно дизассемблирует как команду

SUB коды "2(A,B) (C-F)(0-F)" и "82 (2,6,A,E)(8-F)".

7.03-90 TEST – побитовая проверка

Команда TEST приводит флаги SF, ZF и PF в соответствие с результатом логической операции "И" (AND) над своими операндами. Однако при исполнении команды TEST результат никуда не записывается, и оба операнда сохраняют свои значения. Флаг переноса CF и флаг переполнения OF всегда сбрасываются командой TEST в состояния NC (No Carry) и NV (No oVerflow) соответственно. Состояние флага AF не сохраняется.

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

84

(0-B)(0-F)

0-2

TEST [bp+si+ffff],bl

84

(C-F)(0-F)

 

TEST bl,bl

85

(0-B)(0-F)

0-2

TEST [bp+si+ffff],bx

85

(C-F)(0-F)

 

TEST bx,bx

A8

 

1

TEST AL,ff

A9

 

2

TEST AX,ffff

– 305 –

 

 

Глава 7:

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

Продолжение таблицы 7.03-90

 

 

 

 

 

 

F6

 

 

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

 

1-3

 

TEST byte ptr [bp+si+ffff],ff

 

 

 

 

 

 

 

F6

 

 

C(1-7)

 

 

1

 

TEST bl,ff

 

 

F7

 

 

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

 

2-4

 

TEST word ptr [bp+si+ffff],ffff

 

 

F7

 

 

C(1-7)

 

 

2

 

TEST bx,ffff

 

7.03-91 XCHG – обмен операндов

Команда XCHG (eXCHanGe) меняет местами содержимое указанных регистров или регистра и ячейки памяти. Состояния флагов при этом не изменяются.

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

86

(0-B)(0-F)

0-2

XCHG [bp+si+ffff],bl

86

(C-F)(1-7,9-F)

 

XCHG bl,bl

87

(0-B)(0-F)

0-2

XCHG [bp+si+ffff],bx

87

(C-F)(1-7,9-F)

 

XCHG bx,bx

9(1-7)

 

 

XCHG bx,AX

7.03-92 XLAT – табличный перевод

Команда XLAT (transLATe) вычисляет сумму (AL + BX) и затем копирует байт из ячейки памяти по адресу DS:(AL + BX) в однобайтовый регистр AL, замещая его прежнее содержимое. Состояния флагов и содержимое регистра BX сохраняются без изменений.

Команда XLAT используется для перевода кодов по кодовой таблице длиной до 256 байт, которая должна быть заранее загружена начиная с адреса DS:BX. Принимаемый по умолчанию сегментный регистр DS: может быть заменен другим посредством указания префикса смены сегмента (7.02-01).

 

Код

Пример

 

D7

XLAT

7.03-93 XOR – исключающее ИЛИ

 

Команда XOR (eXclusive OR) поразрядно сопоставляет биты операндов, сбрасывая бит результата в нуль, если биты в соответствующих разрядах сопоставляемых операндов одинаковы, и устанавливая бит результата в единицу, если биты в соответствующих разрядах сопоставляемых операндов разные. Результат замещает собою первый операнд. Состояния флагов SF, ZF, PF приводятся в соответствие с полученным результатом. Флаги CF и OF

– 306 –

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

сбрасываются в состояния NC (No Carry) и NV (No oVerflow) соответственно. Состояние флага AF не сохраняется.

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

30

(0-B)(0-F)

0-2

XOR [bp+si+ffff],bl

30

(C-F)(0-F)

 

XOR bl,bl

31

(0-B)(0-F)

0-2

XOR [bp+si+ffff],bx

31

(C-F)(0-F)

 

XOR bx,bx

32

(0-B)(0-F)

0-2

XOR bl,[bp+si+ffff]

33

(0-B)(0-F)

0-2

XOR bx,[bp+si+ffff]

34

 

1

XOR AL,ff

35

 

2

XOR AX,ffff

80

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

1-3

XOR byte ptr [bp+si+ffff],ff

80

F(1-7)

1

XOR bl,ff

81

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

2-4

XOR word ptr [bp+si+ffff],ffff

81

F(1-7)

2

XOR bx,ffff

83

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

1-3

XOR word ptr [bp+si+ffff],±7f

83

F(1-7)

1

XOR bx,±7f

Примечание 1: команда XOR с указанием одного и того же регистра в качестве обоих операндов часто используется для обнуления регистров.

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

XOR коды "3(2,3) (C-F)(0-F)" и "82 (3,7,B,F)(0-7)".

7.04Команды, пересылаемые арифметическому сопроцессору

Ассемблерные команды, название которых начинается с буквы "F" (= Float), – это команды, которые центральный процессор пересылает для исполнения арифметическому сопроцессору. Все современные компьютеры исполняют такие команды, потому что имеют встроенный арифметический сопроцессор в составе центрального процессора.

В компьютерах со старыми процессорами, включая некоторые варианты 80486-х, арифметический сопроцессор нередко отсутствует. В таких компьютерах исполнение команд сопроцессора возможно посредством эмуляции, но для этого надо выполнить два условия:

во-первых, обеспечить генерацию прерывания INT 07 (8.01-08) в ответ на

каждую сопроцессорную команду посредством установки в единицу бита 02h в управляющем регистре CR0 (A.11-4).

во-вторых, установить такой обработчик прерывания INT 07, который способен осуществить эмуляцию команд сопроцессора.

307 –

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

В некоторых старых компьютерах удовлетворение обоих перечисленных условий автоматически обеспечивается системой BIOS, в других об этом предоставлено побеспокоиться пользователю. В любом случае наличие сопроцессора в компьютере можно определить с помощью прерывания INT 11 (8.01-36, A.11-1).

Если не исключена вероятность исполнения Вашей программы на старых процессорах с отдельной микросхемой сопроцессора, то перед каждой командой сопроцессора надо ставить префикс WAIT (7.02-05), обеспечивающий синхронизацию передачи команд от процессора к сопроцессору. В современных

процессорах со встроенным сопроцессором синхронизация осуществляется аппаратными средствами, им префикс WAIT не нужен, его наличие допускается, но обычно игнорируется.

7.04-01 F2XM1 – аппроксимация степенной функции

Команда F2XM1 возвращает сумму ряда, используемого для аппроксимации степенной функции числа 2 в интервале значений показателя степени от –1 до +1. Показатель степени должен быть в ST(0) – верхнем регистре стека сопроцессора, туда же после завершения операции помещается вычисленная сумма ряда.

Конечный результат может быть представлен формулой

ST(0) = –1+2^ST(0).

Код

Пример

D9F0

F2XM1

7.04-02 FABS – абсолютное значение

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

 

 

Код

Пример

 

 

D9E1

FABS

7.04-03

FADD – сложение действительных чисел

Команда FADD суммирует число, считываемое из памяти или регистра сопроцессора, если он указан в качестве второго операнда, с другим числом, находящимся в верхнем регистре ST(0) стека сопроцессора или в другом регистре стека, если он указан первым из двух операндов. Получаемая сумма замещает

– 308 –

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