- •Кафедра специализированных компьютерных систем методические указания
- •1 Задание для курсовой работы
- •Формулировка задания
- •Варианты заданий
- •Указания к выполнению курсовой работы
- •Структурное оформление программы
- •Содержание и оформление пояснительной записки
- •Общая информация
- •Оформление программных документов
- •Краткие сведения о математическом сопроцессоре
- •Программная модель сопроцессора
- •Форматы представления вещественных чисел
- •Система команд сопроцессора
- •Использование обратной польской записи
- •Преобразование выражений в формат полиз
- •Алгоритм вычисления выражений
- •Ввод вещественных чисел с клавиатуры и вывод на экран
- •Ввод и преобразование символьной информации
- •Вывод результата вычислений
- •Приложение б
- •Приложение в Программа преобразования вещественного числа короткого формата (32 бита) в символьное представление
Приложение в Программа преобразования вещественного числа короткого формата (32 бита) в символьное представление
;Перевод вещественного числа в символьное представление
masm
model use16 small
.586p
.stack 256h
.data
a1 dq -89.12345678e-15
pow_dec dw 0
i_save dd 0
f_save dq 0.0
c_05 dd 0.5
c_10 dd 10.0
i_tol dw 10 ;точность представления дробной части
i_part dw 0
f_part dt 0
flag db 0
m_sign db 0 ;знак мантиссы
p_sign db 0 ;знак порядка
string db 20 dup(" ")
.code
start:
mov ax,@data
mov ds,ax
finit
fld a1 ;загрузка числа в st(0)
;-------проверка знака числа
ftst ;сравнение st(0) с нулем
fstsw ax ;сохранение слова состояния сопроцессора в ax
sahf ;отображение ah на регистр флагов
jnc posit_m ;если >= 0, то ничего не делать
fchs ;если меньше 0 - изменить знак
mov m_sign,1 ;установить флаг знака мантиссы
posit_m:
fxtract ;выделение мантиссы и порядка числа
fxch st(1) ;порядок в st(0), мантиссу в st(1)
;-------проверка знака порядка
ftst ;сравнение st(0) с нулем
fstsw ax ;сохранение слова состояния сопроцессора в ax
sahf ;отображение ah на регистр флагов
jnc posit_p ;если >= 0, не устанавливать флаг знака
mov p_sign,1 ;установить флаг знака порядка
posit_p:
fldlg2 ;загрузка в st(0) log10(2)
fmul ;переход от двоичного порядка к десятичному
fst f_save ;сохранение вещественного десятичного порядка
fsub c_05 ;сохранение целой части
fistp pow_dec ;десятичного порядка
fld f_save
fisub pow_dec
fldl2t
fmul
fst f_save
fsub c_05
fistp i_save
fld f_save
fisub i_save
f2xm1
fld1
fadd
fild i_save
fld1
fscale
fxch st(1)
fistp i_save
fmul
fmul
fcom c_10
fstsw ax
sahf
jc m1 ;если десятичная мантисса меньше 10
;то не корректируем ее.
;------корректировка десятичной мантиссы
fidiv c_10
cmp p_sign,0 ;если порядок положительный
jz inc_pow ;то увеличиваем его на единицу
dec pow_dec ;в противном случае уменьшаем
jmp m1
inc_pow:
inc pow_dec
m1:
;------выделение целой части мантиссы
fst f_save ;округляем мантиссу до меньшего
fsub c_05 ;целого числа
fistp i_part ;и сохраняем
;------выделение дробной части мантиссы
fld f_save ;восстанавливаем мантиссу в st(0)
fisub i_part ;вычитаем целую часть
;------умножение дробной части на 10^i_tol
fldl2t ;в st(0) log2(10)
fimul i_tol
fst f_save ;промежуточно сохранение показателя степени
fsub c_05 ;округление до меньшего целого
fistp i_save ;и промежуточное сохранение
fld f_save ;сохраненное число в st(0)
fisub i_save ;определение дробной части показателя
f2xm1 ;возведение числа 2 в дробную часть степени
fld1 ;загрузка в st(0) числа 1
fadd ;корректировка результата на 1
fild i_save ;загрузка в st(0) целой части показателя ст.
fld1 ;в st(0) число 1
fscale ;возведени 2 в целую часть степени
fxch st(1) ;результат в st(1)
fistp i_save ;освобождение st(0)
fmul ;перемножение двух промежуточных результатов
fmul ;масштабирование дробной части мантиссы
;-------сохранение дробной части в BCD формате
fbstp f_part
mov di,0
;-------запись знака (в случае отрицательного числа)
cmp m_sign,0
jz setm ;если флаг знака =0, то обойти запись знака
mov string[di],"-"
inc di
;-------перевод мантиссы в символьную форму
setm:
mov al,byte ptr i_part
add al,30h
mov string[di],al
inc di
;-------добавление десятичной точки
mov string[di],"."
inc di
;-------перевод дробной части в символьную форму
mov si,9 ;указатель позиции на конец области памяти
mov cx,10 ;в счетчик цикла размер числового поля
cycl:
xor ax,ax ;очистка ax
mov al,byte ptr f_part[si] ;очередные две цифры числа в al
cmp al,0
jz m2
jmp m3
m2:
cmp flag,0
jz m4
m3:
ror ax,4
mov bl,al
add bl,30h
mov string[di],bl
inc di
shr ah,4
add ah,30h
mov string[di],ah
inc di
mov flag,1
m4:
dec si
loop cycl
;-------запись символа "Е"
mov string[di],"E"
inc di
;-------запись знака порядка(в случае отрицательного числа)
cmp p_sign,0
jz m5 ;если флаг знака =0, то порядок положителен
mov string[di],"-" ;записать в строку отрицательный знак порядка
mov ax,pow_dec ;и изменить знак порядка
not ax ;на положительный
add ax,1 ;для работоспособности
mov pow_dec,ax ;дальнейшего кода
jmp setpow
m5:
mov string[di],"+" ;записать в строку положительный знак порядка
;-------перевод порядка в символьную форму
setpow:
inc di ;продвинуть позицию в строке для записи
mov ax,word ptr pow_dec ;загрузить порядок в ax
mov bl,100
div bl ;выделение числа сотен в al
add al,30h ;перевод в ASCII код цифры
mov string[di],al ;запись символа в строку с результатом
inc di ;переход к следующему байту
shr ax,8 ;остаток от деления в al
mov bl,10
div bl ;выделени числа десятков в al
add al,30h ;перевод в ASCII код цифры
mov string[di],al ;запись символа в строку с результатом
inc di ;переход к следующему байту
shr ax,8 ;остаток от деления в al
add al,30h ;перевод в ASCII код цифры
mov string[di],al ;запись символа в строку с результатом
inc di ;переход к следующему байту
mov string[di],"$" ;запись признака конца строки
mov ah,09h ;в al номер функции DOS вывода строки
mov dx,offset string ;запись признака конца строки
int 21h ;вывод строки на экран
mov ax,4c00h ;завершение
int 21h ;процесса
end start
