Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания по Архитектуре ЭВМ и сист...doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.69 Mб
Скачать

Деление двоичных чисел со знаком

Для деления чисел без знака предназначена команда

idiv делитель

Делитель может находиться в памяти или в регистре и иметь размер 8, 16 или 32 бита. Местонахождение делимого фиксировано и также как в команде умножения, зависит от размера операндов. Результатом команды деления является значения частного и остатка. Варианты местоположения и размеров операндов операции деления представлены в Таблице 6.

Таблица 6 – Расположение операндов и результата при делении

Делимое

Делитель

Частное

Остаток

Слово 16 байт в регистре ax

Байт – регистр или ячейка памяти

Байт в регистре al

Байт в регистре ah

32 бит

dx – старшая часть

ax – младшая часть

16 бит регистр или ячейка памяти

Слово в регистре ax

Слово в регистре dx

64 бит

edx – старшая часть

eax – младшая часть

32 бит регистр или ячейка памяти

Двойное слово в регистре eax

Двойное слово в регистре edx

После выполнения команды деления содержимое флагов неопределенно, но возможно возникновение прерывания с номером 0, называемого «деление на ноль». Этот вид прерывания относится к так называемым исключениям, оно может возникнуть по одной из следующих причин:

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

  • частное не входит в отведенную под него разрядную сетку

Преобразование типов

В ходе выполнения лабораторных работ для переменных участвующих в арифметических операциях рекомендуется использовать тип данных int, этот тип в ассемблере эквивалентен двойному слову. При выполнении операции деления, следует учитывать, что размер делимого должен быть в два раза больше размера делителя, тогда для правильного выполнения операции деления необходимо преобразовать формат данных у делимого из двойного слова в учетверенное слово. Для этого применяется следующая команда

cdq

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

1 mov eax,delimoe //делимое

2 cdq

3 mov ecx,60

4 idiv ecx //делитель

5 mov eax,delimoe //делимое

6 cdq

7 idiv 60 //делитель

Следует отметить, что применение команды cdq перед любыми арифметическими операциями не является ошибкой.

Пример

Необходимо перевести введенные с клавиатуры минуты в часы. Ниже приведен листинг программы выполняющей это действие.

01 #include "stdafx.h"

02 #include <iostream>

03 using namespace std;

04 int _tmain(int argc, _TCHAR* argv[])

05 {

06 int min;

07 int ch_cel,ch_ost;

08 cout<<"Enter col min";

09 cin>>min;

10 __asm

11 {

12 mov eax,min

13 cdq

14 mov ecx,60

15 idiv ecx

16 mov ch_cel,eax

17 mov ch_ost,edx

18 }

19 cout<<"Col-vo chas:"<<ch_cel<<endl;

20 cout<<"Col-vo min:"<<ch_ost<<endl;

21 system("pause");

22 return 0;

23 }

Следует отметить необходимость обязательного применения команды cdq в строке 13. Это необходимо выполнять вследствие того, что переменная min имеет тип int, а размер переменных типа int равен 4 байтам или 32 битам. Но так как регистр eax в Microsoft Visual Studio имеет разрядность 64 бита или 8 байт необходимо выполнять преобразование типов.