- •Введение Основные определения
- •Системы счисления Основные определения
- •Двоичная, восьмеричная и шестнадцатеричная системы счисления
- •Смешанные системы счисления
- •Перевод чисел из одной системы счисления в другую
- •Арифметические действия в системах счисления с основанием, отличным от 10
- •Двоично-восьмеричные и двоично-шестнадцатеричные преобразования
- •Обратный и дополнительный коды и их применение в операциях с отрицательными числами
- •Сложение и вычитание чисел со знаком в дополнительном коде
- •Архитектура персонального компьютера История развития вычислительной техники
- •Основные термины и определения
- •Функциональная структура компьютера
- •Архитектура микропроцессора
- •Регистры общего назначения и сегментные регистры
- •Управляющие регистры Регистр cr0.
- •Память компьютера
- •Структура программы на языке Ассемблера Формат кодирования в языке Ассемблера
- •Структура программы на ассемблере
- •Простейшая программа в ос Windows
- •Типы и форматы данных в ассемблере
- •Базовая система команд микропроцессора ia-32
- •Операнды языка ассемблер
- •Стандартные директивы сегментации
- •Макрокоманды
- •Процедуры (функции)
- •Организация интерфейса с процедурой
- •Возврат результата из процедуры
- •Связь ассемблера с языками высокого уровня
- •Обработка прерываний
- •Создание исполняемого файла
- •Отладка программы
- •Математический сопроцессор
- •Представление чисел с плавающей точкой в разрядной сетке вычислительной машины
- •Архитектура сопроцессора
- •Система команд сопроцессора
- •Команды передачи данных
- •Команды загрузки констант
- •Команды сравнения данных
- •Арифметические команды
- •Команды управления математическим сопроцессором
- •Пример программы с использованием команд сопроцессора
- •Сложные типы данных Структуры
- •Объединения
- •Программирование для windows
- •Основы программирования в ос Windows
- •Консольные приложения Windows
- •Работа с файлами в системе Windows
- •Вывод чисел в консоль
- •Оконные (каркасные) приложения Windows
- •Графика в оконных приложениях Windows
- •Ресурсы в Windows-приложениях
- •Приложение 1
Вывод чисел в консоль
Сложность вывода чисел состоит в том, что для восприятия человеком число в консоли должно состоять из последовательности символов цифр, а в реальности число – это некоторый эквивалент такой последовательности, представленный с разрядной сетке вычислительной машины. Именно с таким числом производятся вычисления, но для отображения результатов вычислений необходимо перевести число в символьную строку. 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