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

       

Вывод целых десятичных чисел из



Вывод целых десятичных чисел из диапазона 0..999 999 999 999 999 999

Этот способ вывода основан на возможности сопроцессора работать с упакованными десятичными числами. Выше мы уже рассматривали преобразование десятичных чисел в двоичное представление с использованием этой возможности. Система команд сопроцессора содержит команду FBSTP, которая сохраняет десятичное число из вершины стека сопроцессора в области памяти с одновременным преобразованием этого числа в формат десятичного числа. Область памяти, в которую происходит сохранение, должна быть описана директивой DT. Важно отметить, что команда FILD, с помощью которой вы будете помещать целое число в сопроцессор для дальнейшего преобразования, трактует целые числа как числа со знаком. Поэтому попытка задать целое число в виде Offffh (с единичным старшим разрядом операнда) приведет к тому что в стек сопроцессора будет помешено значение со всеми вытекающими отсюда последствиями для результата преобразования.

;prg06_09.asm - программа вывода целого десятичного числа

:из диапазона 0..999 999 999 999 999 999 на экран.

¦.Вход: выводимое значение - в поле string_bin_dword.

¦.Выход: вывод десятичного числа из диапазона 0. .999 999 999 999 999 999 на экран.

.data

:поле string_bin_dword содержит выводимое значение - с помощью идентификаторов.

:вводимых директивой label, это значение может трактоваться как значение

различной разрядности:

string_bin_byte label byte

string_bin_word label word

string_bin_dword label dword



string_bin_qword dq 0de0b6b3a763ffffh :зададим максимально возможное

¦.для сопроцессора двоичное целое со знаком

;в string_pack исходное значение из string bin_dword в упакованном десятичном формате string_pack dt О len_string_pack=$-string_pack adr_string_pack dd string_pack string db 20 dup (0) максимальный результат состоит из 18 десятичных цифр

len_string-$-string adr_stringdd string

.code

:.........преобразуем bin->dec

finit

fild string_bin_qword ;заносим в сопроцессор двоичное целое число fbstp string_pack извлекаем упакованное десятичное :.........распакуем........................................



Ids si.adr_string_pack

add si.len_string_pack-2 ;на конец string_pack (18 упак. дес. цифр)

les di.adr_string

mov ex.9 : 9 пар упакованных десятичных цифр

cycl: xorax.ax

std :string_pack обрабатываем с конца

lodsb :в al очередные 2 упакованные десятичные цифры

¦»;распаковываем - ah-младшая. al-старшая

shi ax.4

rol al.4

ог ах.З0З0п треобразуем в символьное представление

xchg ah.al iah-младшая, al-старшая

eld ;в string записываем с начала

stosw

loop cycl :.........выводим на консоль...............................

mov bx.l -.стандартный дескриптор - экран

mov cx.len_string

Ids dx.adr_string {формируем указатель на строку string

mov ah.40h ;номер функции DOS

int 21h :выводим

jc exit :переход в случае ошибки

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