Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать

Деление с остатком

Пример 2: Выполнить деление положительных чисел В/С; 1000/53=18,46/53. (real3.asm)

.386

.model flat, stdcall

includelib import32.lib

extrn ExitProcess:PROC

extrn MessageBoxA:PROC

.data

Ttl db "Rezultat deleniya raven",0h

Msg db 8 dup(' '),0h

db 0h

B DW 1000

C DW 53

.code

start:

mov ax,B

mov bx,C

mov dx,00h

div bx

cmp dx,0000h

jz m3 ; если остатка нет, то переходим на метку m3.

mov cx,ax

mov ax,C

mov bx,dx

mov si,10

mov edi,7

lp2: xor dx,dx

Если остаток есть, то переводим делитель в десятичную систему исчисления

div si

xchg ax,dx

add al,'0'

mov byte ptr [Msg+edi],al

xchg ax,dx

dec di

or ax,ax

jne lp2

mov byte ptr [Msg+edi],'/'

dec di

mov si,10

mov ax,bx

lp3: xor dx,dx

div si

xchg ax,dx

add al,'0'

mov byte ptr [Msg+edi],al

xchg ax,dx

dec di

or ax,ax ; устанавливает флаг ZF в 1 если в АХ не 0

jne lp3

mov byte ptr [Msg+edi],','

dec di

mov si,10

mov ax,cx

lp4: xor dx,dx

div si

xchg ax,dx

add al,'0'

mov byte ptr [Msg+edi],al

xchg ax,dx

dec di

or ax,ax

jne lp4

jmp m4

m3:

mov si,10

mov edi,7

lp5: xor dx,dx

div si

xchg ax,dx

add al,'0'

mov byte ptr [Msg+edi],al

xchg ax,dx

dec di

or ax,ax

jne lp5

m4:

push 0h

push offset Ttl

push offset Msg

push 0h

call MessageBoxA

push 0h

call ExitProcess

end start

Блок-схема вывода результата при делении с остатком Числа с плавающей запятой. Работа с сопроцессором

В процессорах Intel все операции с плавающей запятой выполняет специальное устройство, FPU (Floating Point Unit), с собственными регистрами и собственным набором команд, поставлявшееся сначала в виде сопроцессора (8087, 80287, 80387, 80487), а начиная с 80486DX — встраивающееся в основной процессор.

Типы данных FPU

Каждое вещественное число имеет мантиссу, порядок и знаковый разряд.

Для типа Double мантисса занимает младшие 52 бита, далее запятая и перед запятой должен стоять бит целой части мантиссы, но поскольку она всегда равна 1, то данный бит не требуется и соответствующий разряд отсутствует в памяти (но он подразумевается). Значение порядка в ЭВМ хранится в виде смещенного числа, т.е. к настоящему значению порядка перед записью его в память прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. Например, для типа Double порядок занимает 11 бит (211 =2048 ) и имеет диапазон от 2-1023 до 21023, поэтому смещение равно 1023(10) = 1111111111(2). Бит с номером 63 указывает на знак числа.

Алгоритм для получения представления действительного числа в памяти ЭВМ:

  1. перевести модуль данного числа в двоичную систему счисления;

  2. нормализовать двоичное число, т.е. записать в виде M × 2p, где M — мантисса (ее целая часть равна 1(2)) и p — порядок, записанный в десятичной системе счисления;

  3. прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;

  4. учитывая знак заданного числа (0 — положительное; 1 — отрицательное), выписать его представление в памяти ЭВМ.

Пример 1. Запишем код числа -312,3125 для типа double.

  1. Двоичная запись модуля этого числа имеет вид 100111000,0101.

  2. Имеем 100111000,0101 = 1,001110000101 × 28.

  3. Получаем смещенный порядок 8 + 1023 = 1031. Далее имеем 1031(10) = 10000000111(2).

  4. Окончательно

1

10000000111

0011100001010000000000000000000000000000000000000000

63

62..52

51..0

1100 0000 0111 0011 1000 0101 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000b=C073850000000000(16).

Пример 2. Из кода действительного числа получить само число. Пусть дан код 3FEC600000000000(16) или

0

01111111110

1100011000000000000000000000000000000000000000000000

63

62..52

51..0