- •Архитектура эвм и систем.
- •Стороженко а.С.
- •Валюкевич н.Е.
- •Оглавление
- •Введение Архитектура персонального компьютера
- •Набор регистров
- •Регистры состояния и управления
- •Организация памяти
- •Типы данных
- •Лабораторная работа №1 Применение inline assembler
- •Краткая теория
- •Функции ввода-вывода
- •Порядок выполнения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа №2 Линейное программирование
- •Краткая теория
- •Команды пересылки данных
- •Арифметические команды
- •Сложение двоичных чисел без знака
- •Вычитание двоичных чисел без знака
- •Умножение двоичных чисел со знаком
- •Деление двоичных чисел со знаком
- •Преобразование типов
- •Порядок выполнения
- •Задания
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа №3 Организация ветвлений в программе
- •Краткая теория
- •Команда сравнения cmp
- •Порядок выполнения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа №4 Циклы
- •Краткая теория
- •Порядок выполнения
- •Задания
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа №5 Циклы
- •Краткая теория
- •Порядок выполнения
- •Задания
- •Контрольные вопросы
- •Лабораторная работа №6 Работа с дисассемблером
- •Краткая теория
- •Порядок выполнения
- •Задания
- •Список рекомендованной литературы
- •Список дополнительной литературы
Деление двоичных чисел со знаком
Для деления чисел без знака предназначена команда
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 байт необходимо выполнять преобразование типов.
