Ассемблер и программирование для IBM PC



       

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


Слово на байт Двойное слово на байт

CMP AH,DIVBYTE CMP DX,DIVWORD JNB переполнение JNB переполнение DIV DIVBYTE DIV DIVWORD

Для команды IDIV данная логика должна учитывать тот факт, что либо делимое, либо делитель могут быть отрицательными, а так как сравниваются абсолютные значения, то необходимо использовать команду NEG для временного перевода отрицательного значения в положительное.

Деление вычитанием

Если частное слишком велико, то деление можно выполнить с помощью циклического вычитания. Метод заключается в том, что делитель вычитается из делимого и в этом же цикле частное увеличивается на 1. Вычитание продолжается, пока делимое остается больше делителя. В cледующем примере, делитель находится в регистре AX, а делимое - в BX, частное вырабатывается в CX:

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

SUB CX,CX ;Очистка частного C20: CMP AX,BX ;Если делимое < делителя, JB C30 ; то выйти SUB AX,BX ;Вычитание делителя из делимого INC CX ;Инкремент частного JMP C20 ;Повторить цикл С30: RET ;Частное в CX, остаток в AX

В конце подпрограммы регистр CX будет содержать частное, а AX - oстаток. Пример умышленно примитивен для демонстрации данной техники деления. Если частное получается в регистро вой паре DX:AX, то необходимо сделать два дополнения:

1. В метке C20 сравнивать AX и BX только при нулевом DX. 2. После команды SUB вставить команду SBB DX,00.

Примечание: очень большое частное и малый делитель могут вызвать тысячи циклов.

ПРЕОБРАЗОВАНИЕ ЗНАКА ------------------------------------------------------------

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

NEG AX NEG BL NEG BINAMT (байт или слово в памяти)

Преобразование знака для 35-битового (или большего) числа включает больше шагов. Предположим, что регистровая пара DX:AX содержит 32-битовое двоичное число. Так как команда NEG не может обрабатывать два регистра одновременно, то ее использование приведет к неправильному результату. В следую щем примере показано использование команды NOT:




Содержание  Назад  Вперед