Иллюстрированный самоучитель по задачам и примерам 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.