Вывод вещественных чисел
Последнее преобразование, которое мы рассмотрим в этом разделе, – преобразование вещественного значения в вид, пригодный для его визуализации на экране консоли. Ниже приведены только те фрагменты программы, которые относятся непосредственно к преобразованию.
;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