Добавлен: 20.10.2018
Просмотров: 787
Скачиваний: 6
Результат деления этим микропроцессором двух целых чисел также не может быть дробным и будет представлен как целое частное и целый остаток. Например, результатом деления 5/2 будет частное, равное 02, и остаток, равный 01, а результатом деления 0Bh/3 (т. е. 11(10)/3) будет частное 03 и остаток 02.
В операциях над однобайтными числами деление осуществляется в регистре-аккумуляторе AX, т. е. содержимое этого регистра делится на любое другое 8-битовое число, которое может храниться в других РОНах или в ячейках памяти.
Результат деления будет возвращаться в этот же регистр АХ, причем частное будет помещено в младшую его половину AL, а остаток – в старшую половину AH.
В
операциях над двухбайтными числами
деление осуществляется в регистрах AX
и DX, т. е. содержимое этих регистров
делится на любое другое
16-битовое
число, которое может храниться в других
регистрах общего назначения или в
ячейках памяти.
Результат деления будет возвращаться в эти же регистры АХ и DX, причем частное будет помещено в регистр AX, а остаток – в регистр DX.
Для рассмотренных ранее примеров:
а) 5/2 – в AX запишется результат 0102, где содержимое AL = 02 является частным, а содержимое AH = 01 является остатком;
б) Bh/3 – в AX запишется результат 0203, т. е. частное 03 запишется в AL, а остаток 02 будет помещен в AH.
При
делении 16-битовых чисел, например, числа
0501h
на число 0100h
(т. е. 1281(10)
/ 256(10))
результат деления будет помещен: частное
05 – в регистр AX (AX = 0005), а остаток 01 – в
регистр DX (DX = 0001).
Во избежание возникновения ошибок деления и срабатывания при этом, как правило, системы прерывания процессора, нужно заботиться о том, чтобы регистры AX и DX перед началом выполнения операции деления были очищены от других, хранившихся там ранее данных (т. е. обнулены). Особенно это касается регистра DX.
Сформулируем теперь рекомендуемую последовательность действий, которую нужно соблюдать при использовании операции деления:
а) при делении однобайтных чисел:
обнулить регистр AX;
делимое заслать в AX или в AL;
делитель заслать в младшую или старшую половину любого РОНа, например, в CL (если же делитель находится в ячейке памяти, адресуемой, например, через BX, то в этой операции нет необходимости);
выполнить операцию деления div СL (или операцию div byte ptr [BX], если делитель находился в ячейке, адресуемой через BX);
результат деления прочитать в AX, причем частное в – AL, а остаток в –АH.
б) при делении двухбайтных чисел:
обнулить регистры AX и DX;
заслать делимое в AX;
заслать делитель в любой (кроме DX) РОН, например в СX (если же, как и в предыдущем примере, делитель находится в ячейке памяти, адресуемой, например, через BX, то в этой операции также нет необходимости);
выполнить операцию деления div СX (или операцию div word ptr [BX], если делитель находился в ячейке, адресуемой через BX);
результат деления прочитать в AX и в DX, причем частное – в регистре AX, а остаток – в регистре DX.
Примечания:
1. В случаях, если делимое меньше делителя (например 2/3), получаемое дробное частное округляется до целого путем отбрасывания дробной части результата. Например, результатом деления числа 2 на число 3 будет частное 0 и остаток 2 , т. е. в регистр AX будет записано 0200. (В случаях, если требуется получить (возвратить) первоначальное значение делимого 2, следует обратную делению операцию умножения выполнять по алгоритму: 03 + 2 = 2).
2. Если частное превышает разрядность аккумулятора (больше FF или FFFF) или делитель является нулем, генерируется прерывание типа 0, а частное и остаток не определены.
3. При возникновении прерывания выполняются следующие действия:
содержимое регистра флагов помещается в стек;
флаги IF и TF сбрасываются в 0;
содержимое сегментного регистра CS помещается в стек;
в регистр CS загружается слово из памяти по адресу 00002;
в регистр IP загружается слово из памяти по адресу 00000.
В результате этих действий МП переходит к подпрограмме обработки прерывания типа 0, полный адрес CS:IP которой берется из ячеек 00002 и 00000.