Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kurs_work (1).doc
Скачиваний:
6
Добавлен:
01.04.2025
Размер:
482 Кб
Скачать
☆

Приложение в Программа преобразования вещественного числа короткого формата (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

29

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]