Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
167 Кб
Скачать
☆

20) Объяснить состав и основные особенности использования арифметических команд и неявное использование регистров в них.

Команды ADD и SUB выполняют сложение и вычитание байтов или слов, содержащих

двоичные данные. Вычитание выполняется по методу сложения с отрицательным числом,

представленным в дополнительном коде. Во всем, кроме первого шага, операции сложения

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

через регистр. В следующем примере к содержимому слова WORDB прибавляется

содержимое слова WORDA, описанных как DW:

Операция умножения для без знаковых данных выполняется командой MUL, для знаковых –

IMUL (Integer Multiplication – умножение целых чисел). Ответственность за выбор

подходящей команды умножения лежит на самом программисте.

Умножение байта на байт: Множимое находится в регистре AL, множитель – в байте

памяти или однобайтовом регистре. После умножения произведение находится в регистре

AX. Операция игнорирует и стирает любые данные, которые находились в регистре AH. Знаковое умножение: команда IMUL

Команда IMUL (Integer MULtiplication – умножение целых чисел) умножает знаковые числа.

Первый пример команды IMUL умножает шест. 80 (отрицательное число) на шест. 40

(положительное число). Произведение – шест. E000 – получается в регистре AX. Используя

те же данные, команда MUL дает в результате шест. 2000, так что можно видеть разницу в

использовании команд MUL и IMUL. Команда MUL рассматривает шест. 80 как +128, а

команда IMUL – как -128. В результате умножения -128 на +64 получается -8192 или шест.

E000.

Второй пример команды IMUL умножает шест. 8000 (отрицательное значение) на шест. 2000

(положительное значение). Произведение – шест. F0000000 – получается в регистрах DX:AX

и представляет собой отрицательное значение.

Деление

Операция деления для без знаковых данных выполняется командой DIV, a для знаковых –

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

два основных вида операции деления:

Деление слова на байт: Делимое находится в регистре AX, делитель – в байте памяти или

однобайтовом регистре. После деления остаток получается в регистре AH, частное – в AL.

Деление двойного слова на слово: Делимое находится в регистровой паре DX:AX,

делитель – в слове памяти или регистре. После деления остаток получается в регистре DX,

частное – в регистре AX. Частное в одном слове допускает максимальное значение 32767

(шест. FFFF) для беззнакового деления и +16383 (шест. 7FFF) для знакового.

Беззнаковое деление: команда DIV

Команда DIV делит беззнаковые числа. На рис. 5 в процедуре D10DIV дано четыре примера

деления: слово на байт, байт на байт, двойное слово на слово и слово на слово. Первый

пример команды DIV делит шест. 2000 (8092) на шест. 80 (128). В результате остаток 00

получается в регистре AH, частное – шест. 40 (64) – в регистре AL.

Второй пример команды DIV выполняет прежде расширение байта BYTE1 до размеров слова.

Так как здесь предполагается беззнаковая величина, то в примере левый бит регистра AH

равен нулю. В результате деления остаток – шест. 12 – получается в регистре AH, частное – шест. 05 – в регистре AL.

Знаковое деление: команда IDIV

Команда IDIV (Integer DIVide) выполняет деление знаковых чисел. На рис. 5 в процедуре

E10IDIV используются те же четыре примера деления, что и в процедуре D10DIV, но вместо

команд DIV записаны команды IDIV. Первый пример команды IDIV делит шест. 2000

(положительное число) на шест. 80 (отрицательное число). Остаток от деления – шест. 00

получается в регистре AH, а частное – шест. C0 (-64) – в регистре AL. Команда DIV,

используя те же числа, генерирует частное +64.

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