Вывод целых десятичных чисел
Вывод целых десятичных чисел из диапазона 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:переход в случае ошибки