Деление чисел без знака
Для деления чисел без знака предназначена команда
div делитель
Делитель может находиться в памяти или в регистре и иметь размер 8, 16 или 32 бит. Местонахождение делимого фиксировано и так же, как в команде умножения, зависит от размера операндов. Результатом команды деления являются значения частного и остатка.
Варианты местоположения и размеров операндов операции деления показаны в табл. 3.
Таблица 3. Расположение операндов и результата при делении
Делимое | Делитель | Частное | Остаток |
16 бит в регистре ax |
Байт регистр или ячейка памяти |
Байт в регистре al |
Байт в регистре ah |
32 бит dx — старшая часть ax — младшая часть |
Слово 16 бит регистр или ячейка памяти |
Слово 16 бит в регистре ax |
Слово 16 бит в регистре dx |
64 бит edx — старшая часть eax — младшая часть |
Двойное слово 32 бит регистр или ячейка памяти |
Двойное слово 32 бит в регистре eax |
Двойное слово 32 бит в регистре edx |
После выполнения команды деления содержимое флагов неопределенно, но возможно возникновение прерывания с номером 0, называемого “деление на ноль”. Этот вид прерывания относится к так называемым исключениям. Эта разновидность прерываний возникает внутри микропроцессора из-за некоторых аномалий во время вычислительного процесса. Прерывание 0, “деление на ноль”, при выполнении команды div может возникнуть по одной из следующих причин:
делитель равен нулю;
частное не входит в отведенную под него разрядную сетку, что может случиться в следующих случаях:
при делении делимого величиной в слово на делитель величиной в байт, причем значение делимого в более чем 256 раз больше значения делителя;
при делении делимого величиной в двойное слово на делитель величиной в слово, причем значение делимого в более чем 65 536 раз больше значения делителя;
при делении делимого величиной в учетверенное слово на делитель величиной в двойное слово, причем значение делимого в более чем 4 294 967 296 раз больше значения делителя.
К примеру, выполним деление значения в области del на значение в области delt (листинг 6).
Листинг 6. Деление чисел <1> ;prg_8.6.asm <2> masm <3> model small <4> stack 256 <5> .data <6> del_b label byte <7> deldw 29876 <8> delt db 45 <9> .code ;сегмент кода <10> main: ;точка входа в программу <11> ... <12> xor ax,ax <13> ;последующие две команды можно заменить одной mov ax,del <14> mov ah,del_b ;старший байт делимого в ah <15> mov al,del_b+1 ;младший байт делимого в al <16> div delt ;в al — частное, в ah — остаток <17> ... <18> endmain ;конец программы |