Сборник по задачам и примерам Assembler

       

Вывод вещественных чисел



Вывод вещественных чисел

Последнее преобразование, которое мы рассмотрим в этом разделе, — преобразование вещественного значения в вид, пригодный для его визуализации на экране консоли. Ниже приведены только те фрагменты программы, которые относятся непосредственно к преобразованию. Полный текст программы находится в е.

;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


 
Содержание раздела