REPNE SCASB

Так как область NAME1 содержит слово "Assemblers", то
команда SCASB находит символ "m" в пятом сравнении. При
использовании отладчика DEBUG для трассировки команд в конце
процедуры H10SCAS можно увидеть в регистре AH значение 03
для индикации того, что символ "m" найден. Команда REP SCASB
кроме того уменьшит значение регистра CX от 10 до 06.
Команда SCASW сканирует в памяти слово на соответствие
значению в регистре AX. При использовании команд LODSW или
MOV для пересылки слова в регистр AX, следует помнить, что
первый байт будет в регистре AL, а второй байт - в регистре
AH. Так как команда SCAS сравнивает байты в обратной
последовательности, то oперация корректна.

СКАНИРОВАНИЕ И ЗАМЕНА
------------------------------------------------------------

В процессе обработки текстовой информации может
возникнуть необходимость замены определенных символов в
тексте на другие, например, подстановка пробелов вместо
различных редактирующих символов. В приведенном ниже
фрагменте программы осуществляется сканирование cтроки
STRING и замена символа амперсанд (&) на символ пробела.
Когда команда SCASB обнаружит символ & (в примере это
будет позиция STRING+8), то операция сканирования прекратит
ся и регистр DI будет содержать aдрес STRING+9. Для получе
ния адреса символа & необходимо уменьшить содержимое DI на
единицу и записать по полученному адресу символ пробела.

STRLEN EQU 15 ;Длина поля STRING
STRING DB 'The time&is now'
...
CLD
MOV AL,'&' ;Искомый символ
MOV CX,STRLEN ;Длина поля STRING
LEA DI,STRING ;Адрес поля STRING
REPNE SCASB ;Сканировать



Ассемблер для IBM PC. Глава 11 248


JNZ K20 ;Символ найден?
DEC DI ;Да - уменьшить адрес
MOV BYTE PTR[DI],20H ;Подставить пробел
K20: RET

АЛЬТЕРНАТИВНОЕ КОДИРОВАНИЕ
------------------------------------------------------------

При использовании команд MOVSB или MOVSW ассемблер
предполагает наличие корректной длины строковых данных и не
требует кодирования операндов в команде. Для команды MOVS
длина должна быть закодирована в операндах . Например, если
поля FLDA и FLDB определены как байтовые (DB), то команда

REP MOVS FLDA,FLDB

предполагает повторяющуюся пересылку байтов из поля FLDB в
поле FLDA. Эту команду можно записать также в следующем
виде:
REP MOVS ES:BYTE PTR[DI],DS:[SI]

Однако загрузка регистров DI и SI адресами FLDA и FLDB
oбязательна в любом случае.

ДУБЛИРОВАНИЕ ОБРАЗЦА
------------------------------------------------------------

Команда STOS бывает полезна для установки в некоторой
области oпределенных значений байтов и слов. Для дублирова
ния образца, длина которого превышает размер слова, можно
использовать команду MOVS с небольшой модификацией.
Предположим, что необходимо сформировать строку следующего
вида:
***---***---***---***---***--- . . .

Вместо того, чтобы определять полностью всю строку, можно
определить только первые шесть байтов. Закодируем образец
непосредственно перед обрабатываемой строкой следующим
образом:

PATTERN DB '***---'
DISAREA DB 42 DUP(?)
.
.
CLD
MOV CX,21
LEA DI,DISAREA
LEA SI,PATTERN
REP MOVSW

В процессе выполнения команда MOVSW сначала пересылает
первое слово (**) из образца PATTERN в первое слово области
DISAREA, затем - второе слово (*-), потом третье (--):



Ассемблер для IBM PC. Глава 11 249



***---***---
| |
PATTERN DISAREA

К этому моменту регистр DI будет содержать адрес DISAREA+6,
а pегистр SI - PATTERN+6, который также является адресом
DISAREA. Затем команда MOVSW автоматически дублирует
образец, пересылая первое слово из DISAREA в DISAREA+6, из
DISAREA+2, в DISAREA+8, из DISAREA+4 в DISAREA+10 и т.д. В
результате образец будет полностью продублирован по всей
области DISAREA:

***---***---***---***---***--- . . . ***---
| | | |
PATTERN DISAREA+6 DISAREA+12 DISAREA+42

Данную технику можно использовать для дублирования в
области памяти любого образца любой длины. Образец должен
быть расположен непосредственно перед принимающей областью.

ПРОГРАММА: ВЫРАВНИВАНИЕ ВПРАВО ПРИ ВЫВОДЕ НА ЭКРАН
------------------------------------------------------------

COM-программа, изображенная на рис.1.2, иллюстрирует
почти весь материал, приведенный в этой главе. Процедуры
программы выполняют следующие действия:

B10INPT Принимает имена длиной до 30 символов, вводимых
вверху экрана.
D10SCAS Использует команду SCASB для сканирования имен и об
хода любого ввода, содержащего символ "звездочка".
E10RGHT Использует команду MOVSB для выравнивания имен по
правой границе, выводит имена в колонку в правой
части экрана. Длина в поле ACTNLEN из списка
параметров ввода используется для вычисления самого
правого символа в имени, например:

JEROME KERN
OSCAR HAMMERSTEIN
RICHARD ROGERS

F10CLNM Использует команду STOSW для очистки области имени
в памяти.

------------------------------------------------------------
------------------------------------------------------------
Рис.11.2. Выравнивание вправо при выводе на экран.

ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
------------------------------------------------------------





Ассемблер для IBM PC. Глава 11 250


ъ Для цепочечных команд MOVS, STOS, CMPS и SCAS не забы-
вайте инициализировать регистр ES.

ъ Сбрасывайте (CLD) или устанавливайте (STD) флаг направ
ления в соответствии с направлением обработки.

ъ Не забывайте устанавливать в регистрах DI и SI необходи
мые значения. Например, команда MOVS предполагает
операнды DI,SI, а команда CMPS - SI,DI.

ъ Инициализируйте регистр CX в соответствии с количеством
байтов или слов, участвующих в процессе обработки.

ъ Для обычной обработки используйте префикс REP для
команд MOVS и STOS и модифицированный префикс (REPE или
REPNE) для команд CMPS и SCAS.

ъ Помните об обратной последовательности байтов в сравни
ваемых cловах при выполнении команд CMPSW и SCASW.

ъ При обработке справа налево устанавливайте начальные
адреса на последний байт обрабатываемой области. Если,
например, поле NAME1 имеет длину 10 байтов, то для
побайтовой обработки данных в этой области справа
налево начальный адрес , загружаемый командой LEA,
должен быть NAME1+9. Для бработки слов начальный адрес
в этом случае - NAME1+8.

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
------------------------------------------------------------

11.1. В данной главе приведены эквивалентные команды для а)
MOVSB, б) LODSB и в)STOSB с префиксом REP. Напишите
эквивалентные команды для обработки по словам а)
MOVSW, б) LODSW и в) STOSW с префиксом REP.

11.2. Введите, ассемблируйте и выполните компановку
программы, приведенной на рис.11.1. Не забудьте о
инициализации регистра ES. Замените команды MOVSB и
MOVSW для пересылки справа налево. Измените процедуру
H10SCAS для сканирования поля NAME1 на слово "mb".
Используя отладчик DEBUG для трассировки процедур,
обратите веимание на содержимое сегмента данных и
регистров.

11.3. Имеются следующие определения:

DATASG SEGMENT PARA
CONAME DB 'SPACE EXPLORERS INC.'
PRLINE DB 20 DUP(' ')

Используя цепочечные команды, выполните:
а) пересылку данных из CONAME в PRLINE слева направо;



Ассемблер для IBM PC. Глава 11 251


б) пересылку данных из CONAME в PRLINE справа налево;
в) загрузку третьего и четвертого байтов области
CONAME в регистр AX;
г) сохранение содержимого регистра AX в область по
адресу PRLINE+5;
д) сравнение данных в областях CONAME и PRLINE (они
должны быть не равны);
е) сканирование областей CONAME и PRLINE, и поиск в
ней символа пробел. Если символ будет найден, то
переслать его в регистр BH.

11.4. Переделайте процедуру H10SCAS (рис.11.1) так, чтобы
выполнялось сканирование поля NAME1 на символ "er".
Обратите внимание, что символы "er" не встречаются в
поле NAME1 как одно слово: /As/se/mb/le/rs/. Для
решения этой проблемы возможны два варианта:
а) использовать команду SCASW дважды, причем первая
должна начинаться по адресу NAME1, а вторая - по
адресу NAME1+1;
б) использовать команду SCASB для поиска символа "е"
и сравнить затем следующий байт на символ "r".

11.5. Определите поле, содержащее шест.значения 03, 04, 05
и B4. Продублируйте это поле 20 раз и выдайте
результат на экран.































Ассемблер для IBM PC. Глава 12 262



    ГЛАВА 12. Арифметические операции I: Обработка двоичных данных


------------------------------------------------------------

Арифметические операции I: Обработка двоичных данных

Цель: Дать сведения об операциях сложения, вычитания,
умножения и деления двоичных данных.

ВВЕДЕНИЕ
------------------------------------------------------------

Несмотря на то, что мы привыкли к десятичной арифметике
(база 10), компьютер работает только с двоичной арифметикой
(база 2). Кроме того, ввиду ограничения, накладываемого
16-битовыми регистрами, большие величины требуют специальной
обработки.
Данная глава дает сведения об операциях сложения,
вычитания, умножения и деления для беззнаковых и знаковых
данных. В главе приводятся много примеров и предупреждений о
различных ловушках для опрометчивых исследователей мира
микропроцессора. В следующей главе будут раскрыты операции
преобразования между двоичными данными и ASCII кодами.

СЛОЖЕНИЕ И ВЫЧИТАНИЕ
------------------------------------------------------------

Команды ADD и SUB выполняют сложение и вычитание байтов
или слов, содержащих двоичные данные. Вычитание выполняется
в компьютере по методу сложения с двоичным дополнением: для
второго операнда устанавливаются обратные значения бит и
прибавляется 1, а затем проиCXодит сложение с первым
операндом. Во всем, кроме первого шага, операции сложения и
вычитания идентичны.
На рис. 12.1 представленны примеры команд ADD и SUB,
обрабатывающие байты или слова. В процедуре B10ADD
используется команда ADD для сложения байтов, а в процедуре
C10SUB команда SUB вычитает слова. Примеры показывают все
пять возможных ситуаций:
сложение/вычитание регистр-регистр;
сложение/вычитание память-регистр;
сложение/вычитание регистр-память;
сложение/вычитание регистр-непоср.значение;
сложение/вычитание память-непоср.значение.

------------------------------------------------------------
------------------------------------------------------------
Рис. 12.1 Примеры команд ADD и SUB.

Поскольку прямой операции память-память не существует,
данная oперация выполняется через регистр. В следующем
примере к содержимому слова WORDB прибавляется содержимое
слова WORDA, описанных как DW:



Ассемблер для IBM PC. Глава 12 263



MOV AX,WORDA
ADD AX,WORDB
MOV WORDB,AX

Переполнения

Опасайтесь переполнений в арифметических операциях. Один
байт содержит знаковый бит и семь бит данных, т.е. значения
от -128 до +127. Результат арифметической операции может
легко превзойти емкость однобайтового регистра. Например,
результат сложения в регистре AL, превышающий его емкость,
автоматически не переходит в регистр AH. Предположим, что
регистр AL содержит шест.60, тогда результат команды

ADD AL,20H

генерирует в AL суумму - шест.80. Но операция также
устанавливает флаг переполнения и знаковый флаг в состояние
"отрицательно". Причина заключается в том, что шест.80 или
двоичное 1000 0000 является отрицательным числом. Т.е. в
результате, вместо +128, мы получим -128. Так как регистр
AL слишком мал для такой операции и следует воспользоваться
регистром AX. В следующем примере команда CBW (Convert Byte
to Word - преобразовать байт в слово) преобразует шест.60 в
регистре AL в шест.0060 в регистре AX, передавая при этом
знаковый бит (0) через регистр AH. Команда ADD генерирует
теперь в регистре AX правильный результат: шест.0080, или
+128:

CBW ;Расширение AL до AX
ADD AX,20H ;Прибавить к AX

Но полное слово имеет также ограничение: один знаковый
бит и 15 бит данных, что соответствует значениям от -32768
до +32767. Рассмотрим далее как можно обрабатывать числа,
превышающие эти пределы.

Многословное сложение

Максимальное возможное значение в регистре +32767 ограни
чивает возможность компьютера для выполнения арифметических
операций. Рассмотрим два способа выполнения арифметических
операций. Первый способ - более прост, но специфичен, второй
- сложнее, но имеет общий характер.

------------------------------------------------------------
------------------------------------------------------------
Рис. 12.2. Сложение двойных слов.







Ассемблер для IBM PC. Глава 12 264


На рис.12.2 процедура D10DWD демонстрирует простой способ
сложения содержимого одной пары слов (WORD1A и WORD1B) с
содержимым второй пары слов (WORD2A и WORD2B) и сохранения
суммы в третьей паре слов (WORD3A и WORD3B). Сначала
выполняется сложение правых слов:

WORD1B BC62
WORD2B 553A
Сумма: 1119C

Сумма - шест.1119C превышает емкость регистра AX.
Переполнение вызывает установку флага переноса в 1. Затем
выполняется сложение левых слов, но в данном случае, вместо
команды ADD используется команда сложения с переносом ADC
(ADd with Carry). Эта команда складывает два значения, и
если флаг CF уже установлен, то к сумме прибавляется 1:

WORD1A 0123
WORD2A 0012
Плюс перенос 1
Сумма: 0136

При использовании отладчика DEBUG для трассировки
арифметических команд можно увидеть эту сумму 0136 в
регистре AX, и обpатные значения 3601 в поле WORD3A и 9C11 в
поле WORD3B.
На рис.12.2 процедура E10DWD демонстрирует подход к
сложению значений любой длины. Действие начинается со
сложения самых правых слов складываемых полей. В первом
цикле складываются правые cлова, во втором - слова,
расположенные левее. При этом адреса в регистрах SI, DI и BX
уменьшаются на 2. По две команда DEC выполняют эту операцию
для каждого регистра. Применять команду

SUB reg,02

в данном случае нельзя, т.к. при этом будет очищен флаг
переноса, что приведет к искажению результата сложения.
Ввиду наличия цикла, используется только одна команда
сложения ADC. Перед циклом команда CLC (CLear Carry -
очистить флаг переноса) устанавливает нулевое значение флага
переноса. Для работы данного метода необходимо: 1) обеспе
чить смежность слов, 2) выполнять обработку справа налево и
3) загрузить в регистр CX число складываемых слов.
Для многословного вычитания используется команда SBB
(SuBtract with Borrow - вычитание с заемом) эквивалентная
команде ADC. Заменив в процедуре E10DWD (рис.12.2) команду
ADC на SBB, получим процедуру для вычитания.

БЕЗЗНАКОВЫЕ И ЗНАКОВЫЕ ДАННЫЕ
------------------------------------------------------------





Ассемблер для IBM PC. Глава 12 265


Многие числовые поля не имеют знака, например, номер
абонента, aдрес памяти. Некоторые числовые поля предлагаются
всегда положительные, например, норма выплаты, день недели,
значение числа ПИ. Другие числовые поля являются знаковые,
так как их содержимое может быть положительным или
отрицательным. Например, долговой баланс покупателя, который
может быть отрицательным при переплатах, или алгебраическое
число.
Для беззнаковых величин все биты являются битами данных и
вместо ограничения +32767 регистр может содержать числа до
+65535. Для знаковых величин левый байт является знаковым
битом. Команды ADD и SUB не делают разницы между знаковыми
и беззнаковыми величинами, они просто складывают и вычитают
биты. В следующем примере сложения двух двоичных чисел,
первое число содержит единичный левый бит. Для беззнакового
числа биты представляют положительное число 249, для
знакового - отрицательное число -7:

Беззнаковое Знаковое
11111001 249 -7
00000010 2 +2
11111011 251 -5

Двоичное представление результата сложения одинаково для
беззнакового и знакового числа. Однако, биты представляют
+251 для беззнакового числа и -5 для знакового. Таким
одразом, числовое содержимое поля может интерпретироваться
по разному.
Состояние "перенос" возникает в том случае, когда имеется
пеpенос в знаковый разряд. Состояние "переполнение" возника
ет в том случае, когда перенос в знаковый разряд не создает
переноса из разрядной сетки или перенос из разрядной сетки
проиCXодит без переноса в знаковый разряд. При возникновении
переноса при сложении беззнаковых чисел, результат получает
ся неправильный:

Беззнаковое Знаковое CF OF
11111100 252 -4
00000101 5 +5
00000001 1 1 1 0
(неправильно)

При возникновении переполнения при сложении знаковых
чисел, результат получается неправильный:

Беззнаковое Знаковое CF OF
01111001 121 +121
00001011 11 +11
10000100 132 -124 0 1
(неправильно)

При операциях сложения и вычитания может одновременно
возникнуть и переполнение, и перенос:



Ассемблер для IBM PC. Глава 12 266



Беззнаковое Знаковое CF OF
11110110 246 -10
10001001 137 -119
01111111 127 +127 1 1
(неправильно) (неправильно)

УМНОЖЕНИЕ
------------------------------------------------------------

Операция умножения для беззнаковых данных выполняется
командой MUL, а для знаковых - IMUL (Integer MULtiplication
- умножение целых чисел). Ответственность за контроль над
форматом обрабатываемых чисел и за выбор подходящей команды
умножения лежит на самом программисте. Существуют две
основные операции умножения:

"Байт на байт". Множимое находится в регистре AL, а множи
тель в байте памяти или в однобайтовом регистре. После
умножения произведение находится в регистре AX. Операция
игнорирует и стиpает любые данные, которые находились в
регистре AH.

| AH | AL | | AX |
До умножения:| |Множимое| После:|Произведение|

"Слово на слово". Множимое находится в регистре AX, а мно
житель - в слове памяти или в регистре. После умножения
произведение находится в двойном слове, для которого
требуется два регистра: старшая (левая) часть произведения
находится в регистре DX, а младшая (правая) часть в регистре
AX. Операция игнорирует и стирает любые данные, которые
находились в регистре DX.

| AX | | DX || AX |
До умножения:|Множимое| После: |Ст.часть||Мл.часть|
| Произведение |

В единственном операнде команд MUL и IMUL указывается
множитель. Рассмотрим следующую команду:

MUL MULTR

Если поле MULTR определено как байт (DB), то операция
предполагает умножение содержимого AL на значение байта из
поля MULTR. Если поле MULTR определено как слово (DW), то
опереция предполагает умножение содержимого AX на значение
слова из поля MULTR. Если множитель находится в регистре, то
длина регистра определяет тип операции, как это показанно
ниже:

MUL CL ;Байт-множитель: множимое в AL, произвед. в AX
MUL BX ;Слово-множитель:множимое в AX, произв.в DX:AX



Ассемблер для IBM PC. Глава 12 267



Беззнаковое умножение: Команда MUL

Команда MUL (MULtiplication - умножение) умножает беззна
ковые числа. На рис. 12.3 в процедуре C10MUL дано три
примера умножения: байт на байт, слово на слово и слово на
байт. Первый пример команды MUL умножает шест.80 (128) на
шест.47 (64). Произведение -ш ест.2000 (8192) получается в
регистре AX.

------------------------------------------------------------
------------------------------------------------------------
Рис. 12.3. Беззнаковое и знаковое умножение.

Второй пример команды MUL генерирует шест. 10000000 в
регистpах DX:AX.
Третий пример команды MUL выполняет умножение слова на
байт и требует расширение байта BYTE1 до размеров слова. Так
как предполагаются беззнаковые величины, то в примере левый
бит регистра AH равен нулю. (При использовании команды CBW
значение левого бита регистpа AL может быть 0 или 1).
Произведение - шест. 00400000 получается в регистрах DX:AX.

Знаковое умножение: Команда IMUL

Команда IMUL (Integer MULtiplication - умножение целых
чисел) умножает знаковые числа. На рис. 12.3 в процедуре
D10IMUL используются те же три примера умножения, что и в
процедуре C10MUL, но вместо команд MUL записаны команды
IMUL.
Первый пример команды IMUL умножает шест.80 (отрицатель
ное число) на шест.40 (положительное число). Произведение
- шест.E000 получается в регистре AX. Используя те же
данные, команда MUL дает в результате шест.2000, так что
можно видеть разницу в использовании команд MUL и IMUL.
Команда MUL рассматривает шест.80 как +128, а команда IMUL
- как -128. В результате умножения -128 на +64 получается
-8192 или шест.E000. (Попробуйте преобразовать шест.Е000 в
десятичный формат).
Второй пример команды IMUL умножает шест.8000 (отрицатель
ное значение) на шест.2000 (положительное значение).
Произведение - шест.F0000000 получается в регистрах DX:AX и
представляет собой oтрицательное значение.
Третий пример команды IMUL перед умножением выполняет
расширение байта BYTE1 до размеров слова в регистре AX. Так
как значения предполагаются знаковые, то в примере
используется команда CBW для перевода левого знакового бита
в регистр AH: шест.80 в pегистре AL превращается в шест.FF80
в регистре AX. Поскольку множитель в слове WORD1 имеет
также отрицательное значение, то произведение должно
получится положительное. В самом деле: шест.00400000 в





Ассемблер для IBM PC. Глава 12 268


регистрах DX:AX - такой же результат, как и в случае
умножения командой MUL, которая предполагала положительные
сомножители.
Таким образом, если множимое и множитель имеет одинаковый
знаковый бит, то команды MUL и IMUL генерируют одинаковый
результат. Но, если сомножители имеют разные знаковые биты,
то команда MUL вырабатывает положительный результат
умножения, а команда IMUL - отрицательный.
Можно обнаружить это, используя отладчик DEBUG для
трассировки примеров.

Повышение эффективности умножения: При умножении на
степень числа 2 (2,4,8 и т.д.) более эффективным является
сдвиг влево на требуемое число битов. Сдвиг более чем на 1
требует загрузки величины сдвига в регистр CL. В следующих
примерах предположим, что множимое находится в регистре AL
или AX:

Умножение на 2: SHL AL,1
Умножение на 8: MOV CL,3
SHL AX,CL

Многословное умножение

Обычно умножение имеет два типа: "байт на байт" и "слово
на слово". Как уже было показано, максимальное знаковое
значение в слове ограничено величиной +32767. Умножение
больших чисел требует выполнения некоторых дополнительных
действий. Рассматриваемый подход предполагает умножение
каждого слова отдельно и сложение полученных результатов.
Рассмотрим следующее умножение в десятичном формате:

1365
х12
2730
1365
16380

Представим, что десятичная арифметика может умножать только
двухзначные числа. Тогда можно умножить 13 и 65 на 12
раздельно, cледующим образом:

13 65
х12 х12
26 130
13 65
156 780

Следующим шагом сложим полученные произведения, но поскольку
число 13 представляло сотни, то первое произведение в
действительности будет 15600:

15600



Ассемблер для IBM PC. Глава 12 269


+780
16380

Ассемблерная программа использует аналогичную технику за
исключением того, что данные имеют размерность слов (четыре
цифры) в шестнадцатеричном формате.

Умножение двойного слова на слово. Процедура E10XMUL на
рис.12.4 умножает двойное слово на слово. Множимое, MULTCND,
состоит из двух слов, содержащих соответственно шест. 3206 и
шест. 2521. Определение данных в виде двух слов (DW) вместо
двойного слова (DD) обусловлено необходимостью правильной
адресации для команд MOV, пересылающих слова в регистр AX.
Множитель MULTPLR содержит шест. 6400. Область для записи
произведения, PRODUCT, состоит из трех слов. Первая команда
MUL перемножает MULTPLR и правое cлово поля MULTCND;
произведение - шест. 0E80 E400 записывается в PRODUCT+2 и
PRODUCT+4. Вторая команда MUL перемножает MULTPLR и левое
слово поля MULTCND, получая в результате шест. 138A 5800.
Далее выполняется сложение двух произведений следующим
образом:

Произведение1: 0000 0E80 E400
Произведение 2: 138A 5800
Результат: 138A 6680 E400

Так как первая команда ADD может выработать перенос, то
второе cложение выполняется командой сложения с переносом
ADC (ADd with Carry). В силу обратного представления байтов
в словах в процессоpах 8086/8088, область PRODUCT в действи
тельности будет содержать значение 8A13 8066 00E4.
Программа предполагает, что первое слово в области
PRODUCT имеет начальное значение 0000.

------------------------------------------------------------
------------------------------------------------------------
Рис.12.4. Многословное умножение.

Умножение "двойного слова на двойное слово". Умножение
двух двойных слов включает следующие четыре операции
умножения:

Множимое Множитель

слово 2 х слово 2
слово 2 х слово 1
слово 1 х слово 2
слово 1 х слово 1

Каждое произведение в регистрах DX и AX складывается с
соответствующим словом в окончательном результате. Пример
такого умножения приведен в процедуре F10XMUL на рис. 12.4.




Ассемблер для IBM PC. Глава 12 270


Множимое MULTCND содержит шест. 3206 2521, множитель MULTPLR
- шест. 6400 0A26. Результат заносится в область PRODUCT,
состоящую из четырех слов.
Хотя логика умножения двойных слов аналогична умножению
двойного слова на слово, имеется одна особенность, после
пары команд сложения ADD/ADC используется еще одна команда
ADC, которая прибавляет 0 к значению в поле PRODUCT. Это
необходимо потому, что первая команда ADC сама может вызвыть
перенос, который последующие команды могут стереть. Поэтому
вторая команда ADC прибавит 0, если переноса нет, и
прибавит 1, если перенос есть. Финальная пара команд ADD/ADC
не тредует дополнительной команды ADC, так как область
PRODUCT достаточно велика для генерации окончательного
результата и переноса на последнем этапе не будет.
Окончательный результат 138A 687C 8E5C CCE6 получится в
поле PRODUCT в обратной записи байт в словах. Выполните
трассировку этого примера с помощью отладчика DEBUG.

СДВИГ РЕГИСТРОВОЙ ПАРЫ DX:AX
------------------------------------------------------------