Смекни!
smekni.com

Микропроцессор i8086/i8088 (стр. 6 из 6)

; второй байт буфера резервируется для записи количества реально введенных символов

;

; Возвращаемое значение:

; ax - результат ввода

; ch - количество введенных символов

; cf -

; = 0 в случае успешного преобразования

; = 1 в случае ошибки преобразования

;

; Модификация регистров:

; ax, cx, flags. cf

; - -----------------------------------------------------------------------------------------

do_inputNumberproc

pushdx

pushsi

andcx, 0Fh; обнуление ch (длины введенной строки)

clc; сброс флага ошибки

inccl

mov [di], cl; максимальное количество символов для ввода

deccl

movdx, di; настройка указателя на начало буфера ввода

movah, 0Ah; ввод с клавиатуры

int21h

movch, [di + 1] ; количество введенных символов

cmpch, 0; если = 0, ошибка

jedo_inputNumber_error1

movsi, di; подготовим указатель на первый введенный символ

incsi; для последующего преобразования строки в число

incsi

pushcx; преобразование десятичного числа

movcl, ch

andcx, 0Fh

calldec2int

popcx

jcdo_inputNumber_error1; если ошибка преобразования, выход с ошибкой

cmpbx, ax

jcdo_inputNumber_error2; если превышение лимита, выход с ошибкой

; без очистки результата

jmpdo_inputNumber_exit; если не превышает лимит, выход без ошибки

do_inputNumber_error1: ; ошибка преобразования

xorax, ax; обнулить результат

do_inputNumber_error2: ; ошибка преобразования

stc; установить флаг ошибки

do_inputNumber_exit:

popsi

popdx

ret

do_inputNumberendp

; - -----------------------------------------------------------------------------------------

; Вывод строки на экран.

;

; Параметры:

; dx - адрес строки для вывода, строка должна заканчиваться символом $

;

; Возвращаемое значение: нет

;

; Модификация регистров: нет

; - ----------------------------------------------------------------------------------------

showStringproc

pushax

movah, 9h; вызов функции DOS

int21h

popax

ret

showStringendp

; - -----------------------------------------------------------------------------------------

; Перевод строки.

;

; Параметры: нет

;

; Возвращаемое значение: нет

;

; Модификация регистров: нет

;

; Глобальные переменные:

; [in] writeln – коды перевода строки

; - -----------------------------------------------------------------------------------------

writeLineproc

pushdx

movdx, offset writeln; вывод символов перевода строки

callshowString

popdx

ret

writeLineendp

; - -----------------------------------------------------------------------------------------

; Преобразование строки, содержащей десятичные символы, в число.

; Строка должна содержать строковое представление целого числа в диапазоне 0. .65535.

;

; Параметры:

; ds: si - указатель на первый обрабатываемый символ исходной строки

; cx - количество символов (беззнаковое число)

;

; Возвращаемое значение:

; ax - результат преобразования

; cf -

; = 0 в случае успешного преобразования

; = 1 в случае ошибки преобразования

;

; Модификация регистров:

; ax, flags. cf

; - -----------------------------------------------------------------------------------------

dec2intproc

pushbx

pushcx

pushdx

pushsi

cmpcx, 0; проверка: количество символов 1. .5

jedec2int_error

cmpcx, 5

jadec2int_error

xorax, ax; обнуление результата

xorbx, bx; обнуление регистра-приемника

clc; сброс флага ошибки

dec2int_loop: ; цикл обработки символов исходной строки

movbl, byte ptr [si] ; читать очередной символ

cmpbl, '0'; если меньше 0, ошибка

jbdec2int_error

cmpbl, '9'; если больше 9, ошибка

jadec2int_error

subbl, '0'; вычесть код символа 0

movdx, ax; умножение на 10 содержимого ax:

shlax, 1; ax = 2x

jcdec2int_error

shlax, 1; ax = 4x

jcdec2int_error

addax, dx; ax = 4x + x = 5x

jcdec2int_error

shlax, 1; ax = 10x

jcdec2int_error

addax, bx; добавить промежуточный результат преобразования

jcdec2int_error

incsi; перейти к следующему символу

loopdec2int_loop

jmpdec2int_exit

dec2int_error: ; ошибка преобразования

xorax, ax; обнулить результат

stc; установить флаг ошибки

dec2int_exit:

popsi

popdx

popcx

popbx

ret

dec2intendp

; - ----------------------------------------------------------------------------------------

; Преобразование числа в десятичное строковое представление.

; Полученная строка завершается символом $.

;

; Параметры:

; eax - исходное число

; es: di - указатель на первый символ буфера для выходной строки

;

; Возвращаемое значение:

; выходная строка

;

; Модификация регистров: нет

; - ----------------------------------------------------------------------------------------

int2decproc

pusheax

pushebx

pushcx

pushedx

pushdi

xorebx, ebx

movbl, 10; множитель

xorcx, cx; обнуление счетчика символов

int2dec_loop: ; начало цикла преобразования

xoredx, edx; обнуление промежуточного результата преобразования

divebx; деление ax на 10, в dl - остаток от деления

adddl, '0'; перевод в ASCII

pushdx; сохранение результата в стеке

inccx; увеличить счетчик символов

testeax, eax; проверить ax на 0

jnzint2dec_loop; если что-то осталось,

; продолжить цикл преобразования

cld; направление обработки строк - вперед

int2dec_store: ; цикл формирования конечного результата

popax; восстановить цифру из стека

stosb; записать в результат

loopint2dec_store; проверка окончания цикла

movbyte ptr [di], '$'; добавить символ завершения строки

popdi

popedx

popcx

popebx

popeax

ret

int2decendp

; - -------------------------------------------------------------------------------------- - end start; конец программы

; - ---------------------------------------------------------------------------------------

Литература

1. Бойко В.И. и др. Схемотехника электронных систем. Микропроцессоры и микроконтроллеры. – СПб.: БХВ-Петербург, 2004. .

2. Гутников В.С. Интегральная электроника в измерительных устройствах.2-е изд., перераб. и доп. – Л.: Энергоатомиздат. Ленигр. отд-ние, 1988.

3. Джордейн Р. Справочник программиста персональных компьютеров типа IBMPC, XT и AT. – М.: Финансы и статистика, 1992

4. Зубков С.В. Assembler для DOS, Windows и UNIX. – М.: ДМК Пресс, 2000.

5. Кулаков В. Программирование на аппаратном уровне. Специальный справочник. – СПб: Питер, 2001.

6. Мячев А.А., Степанов В.Н. Персональные ЭВМ и микроЭВМ. Основы организации: Справочник / Под ред.А. А. Мячева. – М.: Радио и связь, 1991.

7. Использование TurboAssembler при разработке программ. – Киев: «Диалектика», 1994

8. Фролов А.В., Фролов Г.В. Операционная система MSDOS. – М.: «Диалог-МИФИ», 1992

9. Юров В.И. Assembler. – СПб: Питер, 2000

10. http: // www. gelezo. com