Вывод вещественных чисел
Вывод вещественных чисел
Последнее преобразование, которое мы рассмотрим в этом разделе, — преобразование вещественного значения в вид, пригодный для его визуализации на экране консоли. Ниже приведены только те фрагменты программы, которые относятся непосредственно к преобразованию. Полный текст программы находится в е.
;prg06_10.asm - программа вывода вещественного числа короткого формата (32 бита).
;Вход: выводимое значение - в поле float32.
:Выход: вывод вещественного числа короткого формата на экран
.data
dec_bin_mant32dt 0 ;мантисса в двоично-десятичном представлении
dec_bin_har32 dt 0 характеристика в двоично-десятичном представлении
cwr dw 0 переменная для сохранения состояния per. cwr
ten dw 10 ;константа, равная 10
float32dd 1.2345678el2 значение вещ. числа размером в 32 бита для вывода
mant32 dd 0 :мантисса в двоичном представлении .
har32 dd 0 характеристика - вещ. формат в двоичном представлении
int_har32 dd 0 характеристика - целое в двоичном представлении
number db 0
char db 0
cursor_column db 0
cursorjine db 0
number_of_digits db 9
flag db 0
.code
next_cursor_column ргос .-процедура сдвига курсора на одну позицию вправо
обязательно наличие в программе процедур::read_cursor_position, set_cursor_position
next_cursor_column endp
set_cursor_position ргос .'процедура позиционирования курсора
set_cursor_position endp
read_cursor_position ргос процедура определения текущей позиции курсора
read_cursor_position endp
print_charргос процедура вывода символа с учетом цвета
;.........
printjrhar endp
positivejiar ргос
:выделение мантиссы из короткого формата (32бита) и ее преобразование
:в двоично-десятичный формат (для положительной характеристики
результат в st(0))
fimul ten
sub int_har32,6 lab_p_h: fidiv ten
cmp int_har32.0
dec int_har32 jg lab_p_h ret I positivejiar endp
negativejiar ргос
:выделение мантиссы из короткого формата (32 бита) и ее преобразование
;в двоично-десятичный формат (для отрицательной характеристики результат в st(0))
fidiv ten
sub int_har32.7 lab_n_h: fimul ten
cmp int_har32.0
inc int_har32
jl lab_n_h
ret
negative_har endp fprint32 proc :вывод вещественного числа (32 бита) в десятичном виде
pusha
установка размера мантиссы в 24 бита fstcw cwr and cwr.1111000011111111b
or cwr.ldew cwr
fid float32:загрузка 32-битного числа в стек сопроцессора fxtract выделение мантиссьКБШ и характеристики^!) fstp mant32 запоминаем мантиссу fist har32 '.запоминаем характеристику щеревод двоичн. характеристики в дес. характеристику fldlg2 -.загрузка десят. лог. двух fimul har32 -.умножение двоичной хар-ки на 1од10(2) frndint -.округление fistp int_har32 сохранение десетяч. характеристики
fild int_har32
fbstp dec_bin_har32 сохранение двоично-десятичного значения характеристики
:выбор процедуры по выделению мантиссы fid float32 cmp har32.0 jge easel
call negativejiar :вызвать процедуру преобразования мантиссы, -.если хар-ка отрицательная
jmp end_case
I^casel: call positivejiar -.вызвать процедуру преобразования мантиссы, -.если хар-ка положительная end_case-. fbstp dec_bin_mant32 сохранение двоично-десятичного представления мантиссы ;вывод на экран вещественного числа lea si.dec_bin_mant32 add si.9 mov- a "I. [si] : вывод знака числа cmp al .0 je zero mov char."-" call print_char call next_cursor_column
:данный фрагмент пропускает байты с нулевым содержимым до первого байта ;со значащей цифрой zero: dec si
dec number_of_digits mov al.[si] cmp a 1.0
jne first_zero ;найден первый байт со значением, отличным от нуля jmp zero ;байт имеет нулевое значение - продолжаем поиск ; просмотр полубайтов первого найденного байта с ненулевым значением first_zero: and al ,11110000b cmp a 1,0 je second_digit :если старший полубайт байта равен нулю, начинаем вывод
:со второго байта jmp first_digit :если старший полубайт байта не равен нулю, начинаем вывод
:с первого байта :начало цикла вывода мантиссы print_digits: dec si
dec number_of_digits :индекс выводимого байта mov al.[si]
:вывод первого полубайта, содержащего цифру first_digit: andal ,11110000b shr al.4 add al.30h mov char.al
call print_char ,
call next_cursor_column
; если выводимая цифра первая, то выводим после нее точку cmp flag.0 jne second_digit mov char."." call print_char ca11 next_cursor_column inc flag
:вывод второго полубайта, содержащего цифру second_digit: mov al. [si] and al,00001111b add a1,30h mov char.al call print_char call next_cursor_column
.-если выводимая цифра первая, то выводим после нее точку cmp flag,0 jne nonfirst_digit mov char,"." call print_char call next_cursor_column inc flag
nonfi rst_digit: cmp number_of_d1g1ts.O jne print_digits mov flag,0
:вывод характеристики числа mov char,"E" call print_char call next_cursor_column lea si,dec_bin_har32
:вывод знака числа add si.9 mov al,[si] cmp al.O je printjiar mov char,"-" call print_char call next_cursor_column : значения характеристики print_har: sub si .9
mov al.[si] ;вывод первой цифры характеристики
and al.11110000b
shr al.4
add al.30h
mov char.al
call print_char
call next_cursor_col umn : вывод второй цифры характеристики
mov al.[s1]
and al.00001111b
add a1.30h
mov char.al
call print_char
call next_cursor_col umn
mov flag.0
fprint32 endp
main proc
\.........
call fprint32