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

Dos7book

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

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

тем самым к копированию следующего двухбайтового слова. Под действием префикса 66h смены разрядности операнда (7.02-06) команда MOVSW копирует по 4 байта сразу и изменяет смещения в индексных регистрах на 4. Все остальные особенности команды MOVSW такие же, как у команды MOVSB (7.03-59).

Код

Пример

A5

MOVSW

7.03-61 MUL – умножение чисел без знака

Команда MUL (MULtiplcation) осуществляет умножение двух целых чисел без знака (для чисел со знаком используют команду IMUL, 7.03-25). Операнд команды MUL представляет одного из сомножителей. Если этот операнд байт, то второй сомножитель должен быть заранее помещен в регистр AL, а результат умножения будет оставлен в регистре AX. Если задаваемый в команде операнд является двухбайтовым словом, то второй сомножитель должен быть заранее помещен в регистр AX, старшие два байта произведения будут оставлены в регистре DX, а младшие два байта в регистре AX.

При исполнении умножения установление флагов OF и CF в состояния OV и CY свидетельствует о том, что старшая часть произведения в регистре AH или в регистре DX содержит значимые цифры. Напротив, сброс флагов OF и CF в состояния NV и NC означает, что старшая часть произведения заполнена только нулями. Состояния флагов SF, ZF, AF и PF не сохраняются, эти флаги остаются в неопределенном состоянии.

Умножать командой MUL можно двоичные и неупакованные десятичные числа. Упакованные десятичные числа необходимо сначала распаковать. В

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

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

F6

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

0-2

MUL byte ptr [bp+si+ffff]

F6

E(0-7)

 

MUL bl

F7

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

0-2

MUL word ptr [bp+si+ffff]

F7

E(0-7)

 

MUL bx

– 289 –

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

7.03-62 NEG – изменение знака числа

Команда NEG вычитает операнд из нуля, изменяя тем самым его знак. При этом нулевой операнд не изменяется. Состояния флагов OF, SF, ZF, AF, PF, CF приводятся в соответствие с полученным результатом.

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

F6

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

0-2

NEG byte ptr [bp+si+ffff]

F6

D(8-F)

 

NEG bl

F7

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

0-2

NEG word ptr [bp+si+ffff]

F7

D(8-F)

 

NEG bx

7.03-63 NOP – команда без операции

Команда NOP (No OPeration) – "пустая" команда, которая не делает ничего, кроме увеличения смещения в регистре IP на единицу.

Код

Пример

90

NOP

7.03-64 NOT – инверсия битов операнда

Команда NOT выполняет логическую операцию НЕ путем инвертирования состояния всех битов операнда. Состояния флагов при этом не изменяются.

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

F6

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

0-2

NOT byte ptr [bp+si+ffff]

F6

D(0-7)

 

NOT bl

F7

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

0-2

NOT word ptr [bp+si+ffff]

F7

D(0-7)

 

NOT bx

7.03-65 OR – логическая операция "ИЛИ"

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

– 290 –

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

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

08

(0-B)(0-F)

0-2

OR [bp+si+ffff],bl

08

(C-F)(0-F)

 

OR bl,bl

09

(0-B)(0-F)

0-2

OR [bp+si+ffff],bx

09

(C-F)(0-F)

 

OR bx,bx

0A

(0-B)(0-F)

0-2

OR bl,[bp+si+ffff]

0B

(0-B)(0-F)

0-2

OR bx,[bp+si+ffff]

0C

 

1

OR AL,ff

0D

 

2

OR AX,ffff

80

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

1-3

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

80

C(9-F)

1

OR bl,ff

81

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

2-4

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

81

C(9-F)

2

OR bx,ffff

83

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

1-3

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

83

C(9-F)

1

OR bx,±7f

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

коды "0(A,B) (C-F)(0-F)" и "82 (0,4,8,C)(8-F)".

Примечание 2: когда оба операнда одинаковы, команда OR их не изменяет, но тем не менее нередко используется только для того, чтобы привести в соответствие состояния флагов.

7.03-66 OUT – отсылка данных в порт

Команда OUT выводит байт или слово данных в порт. При ее исполнении процессор выдает сигнал, по которому происходит переключение шин с памяти на устройства ввода-вывода. Номер адресуемого порта задается первым операндом либо косвенно через регистр DX, либо непосредственно двухзначным шестнадцатеричным числом. Второй операнд команды OUT определяет регистр, содержащий выводимые данные, и вместе с тем их формат: однобайтовый регистр AL, если должен быть выведен байт, или двухбайтовый регистр AX, если должно быть выведено двухбайтовое слово. На состояния флагов команда OUT не влияет.

1-й байт

2-й байт

Байты данных

Примеры

E6

 

1

OUT ff,AL

E7

 

1

OUT ff,AX

EE

 

 

OUT

DX,AL

EF

 

 

OUT

DX,AX

– 291 –

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

Примечание 1: номера некоторых портов приведены в приложении A.14-1. Адресация портов с номерами свыше FFh выполняется только через регистр DX.

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

7.03-67 POP – выталкивание данных из стека

Команда POP копирует двухбайтовое слово данных из вершины стека в указанный регистр или в ячейки памяти, а затем смещает положение вершины стека путем увеличения на 2 смещения в регистре SP – указателе стека. На состояния флагов команда POP не влияет.

1-й байт

2-й байт

Байты

Примеры

Примечания

данных

 

 

 

 

07

 

 

POP ES

 

0F

A1

 

DB 0F A1

= POP FS

0F

A9

 

DB 0F A9

= POP GS

17

 

 

POP SS

 

1F

 

 

POP DS

 

5(8-F)

 

 

POP bx

 

8F

(0,8)(0-7)

0-2

POP [bp+si+ffff]

 

Примечание 1: операции "выталкивания" данных из стека в регистры FS и GS "неизвестны" отладчику DEBUG.EXE, и потому их приходится вводить посредством инструкции DB (7.01-01). По той же причине отладчик не может правильно дизассемблировать такие команды,

однако вместе с тем он не препятствует их отладке при условии работы на компьютере с 32-разрядным процессором.

Примечание 2: отладчик DEBUG.EXE ошибочно дизассемблирует код "8F (C-F)(0-F)" как команду "POP bx".

7.03-68 POPF – восстановление флагов из стека

Команда POPF выталкивает из стека двухбайтовое слово данных в регистр флагов. При этом содержимое указателя стека SP увеличивается на 2.

Код

Пример

9D

POPF

– 292 –

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

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

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

Примечание 3: когда команде POPF предшествует префикс 66h (7.02-06), она "выталкивает" из стека 4 байта в расширенный регистр флагов. Однако при этом установление флага режима V86 аппаратно блокировано (подробнее в примечаниях 4 и 5 к A.11-4).

7.03-69 PUSH – загрузка слова в стек.

Команда PUSH уменьшает смещение в регистре SP (указателе стека) на 2, увеличивая тем самым длину стека на две ячейки для новых данных. В эти ячейки копируется двухбайтовое слово из того источника, который определен операндом команды PUSH. На состояния флагов команда PUSH не влияет.

1-й байт

2-й байт

Байты

Примеры

Примечания

данных

 

 

 

 

06

 

 

PUSH ES

 

0E

 

 

PUSH CS

 

0F

A0

 

DB 0F A0

= PUSH FS

0F

A8

 

DB 0F A8

= PUSH GS

16

 

 

PUSH SS

 

1E

 

 

PUSH DS

 

5(0-7)

 

 

PUSH bx

 

68

 

2

DB 68 ff ff

= PUSH ffff

6A

 

1

DB 6A ff

= PUSH 00ff

FF

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

0-2

PUSH [bp+si+ffff]

 

Примечание 1: команды копирования в стек регистров FS и GS, а также команды "заталкивания" непосредственных операндов отладчику DEBUG.EXE "неизвестны", их приходится вводить посредством инструкции DB (7.01-01). По той же причине отладчик не может их правильно дизассемблировать, однако вместе с тем он не

препятствует их отладке при условии работы на компьютере с 32-разрядным процессором.

Примечание 2: рекомендуется избегать применения операции PUSH SP, потому что разные процессоры исполняют ее по-разному: древние процессоры

– 293 –

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

сначала смещают указатель стека, а потом записывают его значение, а современные процессоры "вталкивают" в стек значение SP, имевшееся на момент выдачи команды. Программы, использующие операцию PUSH SP, на компьютерах с другими процессорами могут вести себя непредсказуемо.

Примечание 3: отладчик DEBUG.EXE ошибочно дизассемблирует код "FF F(0-7)" как команду "PUSH bx".

7.03-70 PUSHF – загрузка флагов в стек

Команда PUSHF (PUSH Flags) загружает стек двухбайтовым словом данных, копируемым из регистра флагов. Смещение в указателе стека SP при исполнении команды PUSHF уменьшается на 2. На состояния флагов команда PUSHF не влияет.

Код

Пример

9C

PUSHF

Примечание 1: когда команде PUSHF предшествует префикс 66h (7.02-06), она

копирует в стек четырехбайтовый расширенный регистр флагов (примечание 4 к A.11-4). Однако при этом копирование флага режима V86 аппаратно блокировано.

7.03-71 RCL – сдвиг влево через перенос

Команда RCL (Rotate through Carry to the Left) выполняет кольцевые сдвиги своего первого операнда влево. При каждом сдвиге все биты смещаются на одну позицию в сторону старших разрядов, в младший бит операнда записывается состояние флага переноса, а старший бит операнда "выталкивается" и становится новым состоянием флага переноса CF. Вместе с ним может измениться и состояние флага переполнения OV. Состояния всех других флагов сохраняются.

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

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D0

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

0-2

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

D0

D(0-7)

 

RCL bl,1

D1

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

0-2

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

– 294 –

 

 

Глава 7:

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

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

 

 

 

 

D1

 

 

D(0-7)

 

 

RCL bx,1

 

 

 

 

 

 

 

D2

 

 

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

0-2

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

 

 

D2

 

 

D(0-7)

 

 

RCL bl,CL

 

 

D3

 

 

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

0-2

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

 

 

D3

 

 

D(0-7)

 

 

RCL bx,CL

 

7.03-72 RCR – сдвиг вправо через перенос

Команда RCR (Rotate through Carry to the Right) выполняет кольцевые сдвиги своего первого операнда вправо. При каждом сдвиге все биты смещаются на одну позицию в сторону младших разрядов, в старший бит операнда записывается состояние флага переноса, а младший бит операнда "выталкивается" и становится новым состоянием флага переноса CF. Вместе с ним может измениться и состояние флага переполнения OV. Состояния всех других флагов сохраняются.

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

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D0

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

0-2

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

D0

D(8-F)

 

RCR bl,1

D1

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

0-2

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

D1

D(8-F)

 

RCR bx,1

D2

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

0-2

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

D2

D(8-F)

 

RCR bl,CL

D3

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

0-2

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

D3

D(8-F)

 

RCR bx,CL

7.03-73 RET – возврат из подпрограммы

Команда RET (RETurn) используется для возврата в вызывающую программу из подпрограмм, находящихся в том же сегменте кода и запускаемых командой CALL с адресом длиной 2 байта (из подпрограмм, запускаемых командой CALL FAR с 4-байтовым адресом возврат надо осуществлять командой RETF, 7.03-74).

Перед исполнением команды RET в вершине стека должен находиться адрес возврата, то есть смещение следующей команды в вызывающей программе. Операнд после команды RET указывать не нужно, если завершаемая подпрограмма не оставляет после себя в стеке ничего лишнего. Но в момент завершения

– 295 –

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

подпрограмм, получающих параметры через стек, эти параметры должны быть из стека удалены, и тогда операнд команды RET обозначает число байт, которые нужно "выбросить" из стека. Команда RET "выталкивает" адрес возврата из стека в регистр IP (указатель команд), а потом прибавляет свой операнд к содержимому регистра SP (указателя вершины стека). Тем самым обеспечивается возврат в

вызывающую программу в пределах одного сегмента и восстановление исходного положения вершины стека. Состояния флагов команда RET не изменяет.

1-й байт

2-й байт

Байты данных

Примеры

C2

 

2

RET

ffff

C3

 

 

RET

 

Примечание 1: после исполнения возврата командой RET FFFE в верхнем регистре стека сохраняется адрес возврата.

Примечание 2: когда код, ассемблируемый отладчиком DEBUG.EXE, не предполагается исполнять вне отладчика как отдельный файл, тогда команду RET можно использовать для прекращения исполнения этого кода в среде отладчика (пример в разделе 9.02-03).

7.03-74 RETF – "дальний" возврат

Команда RETF (RETurn Far) делает все то же самое, что делает команда RET (7.03-73), но дополнительно восстанавливает из стека сегментный адрес в регистре CS:. Так происходит возврат в вызывающую программу из других сегментов.

Команду RETF следует использовать для возврата из подпрограмм и драйверов, вызываемых из других сегментов кода командой CALL FAR (7.03-08) с полным четырехбайтовым адресом, которая сохраняет в стеке сегментный адрес вызывающей программы.

1-й байт

2-й байт

Байты данных

Примеры

CA

 

2

RETF

ffff

CB

 

 

RETF

 

7.03-75 ROL – кольцевой сдвиг влево

Команда ROL (ROtate to the Left) выполняет кольцевые сдвиги своего первого операнда влево. При каждом сдвиге все биты смещаются на одну позицию в сторону старших разрядов, а в младший разряд записывается состояние "выталкиваемого" самого старшего разряда. Соответственно тому на каждом шаге

– 296 –

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

могут изменяться состояния флага переноса CF и флага переполнения OV. Состояния всех других флагов сохраняются.

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

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D0

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

0-2

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

D0

C(0-7)

 

ROL bl,1

D1

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

0-2

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

D1

C(0-7)

 

ROL bx,1

D2

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

0-2

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

D2

C(0-7)

 

ROL bl,CL

D3

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

0-2

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

D3

C(0-7)

 

ROL bx,CL

7.03-76 ROR – кольцевой сдвиг вправо

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

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

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D0

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

0-2

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

D0

C(8-F)

 

ROR bl,1

D1

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

0-2

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

D1

C(8-F)

 

ROR bx,1

D2

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

0-2

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

D2

C(8-F)

 

ROR bl,CL

D3

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

0-2

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

D3

C(8-F)

 

ROR bx,CL

– 297 –

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

7.03-77 SAHF – восстановление состояния флагов

Команда SAHF (Store AH in Flags) копирует байт из однобайтового регистра AH в младшие 8 бит регистра флагов, так что бит 7 становится состоянием знакового флага SF, бит 6 – состоянием флага нуля ZF, бит 4 – состоянием дополнительного флага переноса AF, бит 2 – состоянием флага четности PF, бит 0 – состоянием флага переноса CF. При этом может измениться состояние флага OF, хотя он и не входит в число флагов, устанавливаемых командой SAHF. Биты 5, 3 и 1 в однобайтовом регистре AH не соответствуют каким-либо флагам, и их состояния не принимаются во внимание.

Код

Пример

9E

SAHF

7.03-78 SAR – знаковый сдвиг вправо

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

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

1-й байт

2-й байт

Байты

Примеры

данных

 

 

 

D0

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

0-2

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

D0

F(8-F)

 

SAR bl,1

D1

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

0-2

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

D1

F(8-F)

 

SAR bx,1

D2

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

0-2

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

D2

F(8-F)

 

SAR bl,CL

D3

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

0-2

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

D3

F(8-F)

 

SAR bx,CL

– 298 –

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