Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование и основы алгоритмизации.doc
Скачиваний:
34
Добавлен:
21.08.2019
Размер:
4.84 Mб
Скачать

Вывод чисел в консоль

Сложность вывода чисел состоит в том, что для восприятия человеком число в консоли должно состоять из последовательности символов цифр, а в реальности число – это некоторый эквивалент такой последовательности, представленный с разрядной сетке вычислительной машины. Именно с таким числом производятся вычисления, но для отображения результатов вычислений необходимо перевести число в символьную строку. ASCII-код символа ‘0’ равен 30h. Коды остальных символов цифр располагаются по возрастанию. Следовательно, чтобы получить ASCII-код цифры нужно к ней добавить ASCII-код ‘0’. Для целых чисел программа вывода была рассмотрена в примере «Подсчет количества символов в строке»:

IntToStr proc Number:DWORD, Str1:DWORD

MOV EAX, Number

MOV EDI,Str1

MOV ECX, 0

CMP EAX,0

JGE @I1

MOV DL, '-'

MOV [EDI],DL

INC EDI

NOT EAX

INC EAX

@I1: MOV EBX, 10

MOV EDX, 0

IDIV EBX

PUSH EDX

INC ECX

CMP EAX,0

JG @I1

@I2: POP EDX

ADD DL, 30h

MOV [EDI],DL

INC EDI

LOOP @I2

MOV DL,0

MOV [EDI], DL

INC EDI

MOV EAX, EDI

SUB EAX, Str1

ret

IntToStr endp

В результате получим в строке Str1 число (положительное или отрицательное) в символьном представлении, оканчивающееся ‘\0’–символом.

Для вывода вещественного числа вначале выведем функцией IntToStr его целую часть. После этого в выводимую строку поместим символ ‘.’ и вычтем целую часть из исходного числа. Для преобразования к символам строки дробной части умножим ее на коэффициент требуемой точности 10n и вновь сохраним целую часть полученного числа. Для преобразования в символьную строку снова вызовем функцию IntToStr, но указатель передадим не на начало строки, а на следующий символ строки (регистр edi).

.586

.model flat, stdcall

include console.inc

.data

consoleInHandle DD ?

consoleOutHandle DD ?

a DD -974.600007

str1 DB 20 dup(?)

Numi dd ? ; целая часть числа

tol dd 10000 ; точность

corr dd 0.00001 ; коррекция «лукавого знака»

cw dw ? ; управление округлением

.code

FloatToStr proc Num:DWORD, strr:DWORD

fstcw cw

or cw, 0C00h

fldcw cw

mov edi, strr

mov ecx, 20

@F0: mov byte ptr [edi],0

inc edi

loop @F0

mov edi, strr

fld Num

fadd corr

fldz

fcomip ST, ST(1)

jb @F1

mov byte ptr [edi],'-'

inc edi

@F1: fsub corr

fabs

fadd corr

fist Numi

INVOKE IntToStr, Numi, edi

dec edi

mov bl,'.'

mov [edi],bl

inc edi

fild Numi

fsubrp

fabs

fimul tol

fistp Numi

push tol

push corr

mov corr, 10

@F2: mov edx,0 ; определение количества нулей после точки

mov eax, tol

idiv corr

mov tol, eax

cmp Numi, eax

jge @F3

mov byte ptr [edi],'0'

inc edi

cmp tol, 1

jg @F2

cmp Numi, 0

je @F4

@F3: INVOKE IntToStr, Numi, edi

@F4: pop corr

pop tol

ret

FloatToStr endp

start proc

INVOKE GetStdHandle, STD_INPUT_HANDLE

MOV consoleInHandle,EAX

INVOKE GetStdHandle, STD_OUTPUT_HANDLE

MOV consoleOutHandle,EAX

INVOKE FloatToStr, a, offset str1

INVOKE PrintStr, offset str1, consoleOutHandle

INVOKE ReadSymbol, consoleInHandle, consoleOutHandle, 1

INVOKE ExitProcess, 0

start endp

end start