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

9. Вычитание двоичных чисел без знака

 после команды вычитания чисел без знака нужно анализировать состоя­ние флага CF. Если он установлен в 1, это говорит о том, что произошел заем из старшего разряда и результат получился в дополнительном коде.

Аналогично командам сложения группа команд вычитания состоит из мини­мально возможного набора. Эти команды выполняют вычитание по алгоритмам, которые мы сейчас рассматриваем, а учет особых ситуаций должен производиться самим программистом.

«   Команда декремента выполняеуменьшения значения операнда на 1: dec операнд

•  Команда вычитания (операнд_1 = операнд_1 - операнд_2):

sub операнд_1,операнд_2 8 Команда вычитания с учетом заема, то есть флага CF (операнд_1 = операнд_1 -операнд_2 - значение_СР): Sbb операнд_1.операнд_2 Как видите, среди команд вычитания есть команда SBB, учитывающая флаг пе­реноса CF. Эта команда подобна ADC, но теперь уже флаг CF играет роль индикатора заема 1 из старшего разряда при вычитании чисел.

10.Вычитание двоичных числе со знаком

Вычитание выполняется с помощью команды SUB. Результат также помещается на место первого операнда и опять же выставляются флаги. Единственная разница в том, что происходит вычитание, а не сложение.

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

Примеры:

sub si,dx ;SI = SI - DX

neg ax ;AX = -AX

11. Умножение двоичных чисел без знака

Для умножения чисел без знака предназначена команда MUL. У этой команды только один операнд — второй множитель, который должен находиться в регистре или в памяти. Местоположение первого множителя и результата задаётся неявно и зависит от размера операнда:

Размер операнда

Множитель

Результат

Байт

AL

AX

Слово

AX

DX:AX

Отличие умножения от сложения и вычитания в том, что разрядность результата получается в 2 раза больше, чем разрядность сомножителей. Также и в десятичной системе — например, умножая двухзначное число на двухзначное, мы можем получить в результате максимум четырёхзначное. Запись «DX:AX» означает, что старшее слово результата будет находиться в DX, а младшее — в AX. Примеры:

mul bl ;AX = AL * BL

mul ax ;DX:AX = AX * AX

Если старшая часть результата равна нулю, то флаги CF и ОF будут иметь нулевое значение. В этом случае старшую часть результата можно отбросить. Это свойство можно использовать в программе, если результат должен быть такого же размера, как множители.

12. Деление двоичных чисел без знака

Деление целых двоичных чисел — это всегда деление с остатком! По аналогии с умножением, размер делителя, частного и остатка должен быть в 2 раза меньше размера делимого. Деление чисел без знака осуществляется с помощью команды DIV. У этой команды один операнд — делитель, который должен находиться в регистре или в памяти. Местоположение делимого, частного и остатка задаётся неявно и зависит от размера операнда:

Размер операнда (делителя)

Делимое

Частное

Остаток

Байт

AX

AL

AH

Слово

DX:AX

AX

DX

При выполнении команды DIV может возникнуть прерывание (о прерываниях я подробно расскажу потом, пока старайтесь избегать таких случаев):

  • если делитель равен нулю;

  • если частное не помещается в отведённую под него разрядную сетку (например, если при делении слова на байт частное больше 255).

Примеры:

div cl ;AL = AX / CL, остаток в AH

div di ;AX = DX:AX / DI, остаток в D

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