47602 (Микропроцессор i8086/i8088), страница 5
Описание файла
Документ из архива "Микропроцессор i8086/i8088", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "47602"
Текст 5 страницы из документа "47602"
movdx, offset itemSeparator
callshowString; вывести пробел
loopshowArray_loop
callwriteLine; перевод строки
popdi
popsi
popdx
popcx
popeax
ret
showArrayendp
; - ---------------------------------------------------------------------------------------
; Вывод на экран контрольного кода четности.
;
; Параметры:
; eax - контрольное число
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] codeMsg – сообщение
; [ref] buffer – буфер преобразования числа в строку
; - -----------------------------------------------------------------------------------------
showParityCodeproc
pushdx
pushdi
movdx, offset codeMsg; сообщение
callshowString
movdi, offset buffer
callint2dec; преобразовать в строку
movdx, di
callshowString; вывести на экран
callwriteLine; перевод строки
popdi
popdx
ret
showParityCodeendp
; - ----------------------------------------------------------------------------------------
; Запросить у пользователя номер элемента массива для изменения.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] ARRAYSIZE - размер массива
; [in] numberMsg – запрос на ввод номера элемента массива
; [in] uncorrectMsg – сообщение об ошибке
; [out] changeValueNo – результат ввода
; - ----------------------------------------------------------------------------------------
inputValueNoproc
pushbx
pushcx
pushdx
pushsi
pushdi
movbx, ARRAYSIZE * 4 - 1; максимально допустимое значение
movcl, 2; максимально допустимое количество символов
movdx, offset numberMsg; запрос на ввод номера элемента массива
movsi, offset uncorrectMsg; сообщение об ошибке
movdi, offset changeValueNo; запомнить результат ввода в changeValueNo
callinputNumber
popdi
popsi
popdx
popcx
popbx
ret
inputValueNoendp
; - -----------------------------------------------------------------------------------------
; Запросить у пользователя новое значение элемента массива.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [in] valueMsg - запрос на ввод нового значения элемента массива
; [in] uncorrectMsg – сообщение об ошибке
; [out] changeValue – результат ввода
; - -----------------------------------------------------------------------------------------
inputValueproc
pushbx
pushcx
pushdx
pushsi
pushdi
movbx, 255; максимально допустимое значение
movcl, 3; максимально допустимое количество символов
movdx, offset valueMsg; запрос на ввод нового значения элемента массива
movsi, offset uncorrectMsg; сообщение об ошибке
movdi, offset changeValue; запомнить результат ввода в changeValue
callinputNumber
popdi
popsi
popdx
popcx
popbx
ret
inputValueendp
; - -----------------------------------------------------------------------------------------
; Изменить значение элемента массива.
;
; Параметры: нет
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [ref] dataArray – массив данных
; [in] changeValueNo – номер элемента массива для изменения
; [in] changeValue – новое значение элемента массива
; - -----------------------------------------------------------------------------------------
changeItemproc
pushax
pushbx
pushsi
movbx, offset dataArray
xorax, ax
moval, changeValueNo
movsi, ax
moval, changeValue
mov [bx + si], al
popsi
popbx
popax
ret
changeItemendp
; - ----------------------------------------------------------------------------------------
; Запрос у пользователя числа.
; Вводятся беззнаковые целые числа в диапазоне 0. .65535.
;
; Параметры:
; bx - максимально допустимое значение
; cl - максимально допустимое количество символов
; dx - указатель на строку-приглашение для ввода
; si - указатель на сообщение об ошибке
; di - указатель на байтовую переменную-получатель
;
; Возвращаемое значение: нет
;
; Модификация регистров: нет
;
; Глобальные переменные:
; [ref] buffer – буфер преобразования строки в число
; - -----------------------------------------------------------------------------------------
inputNumberproc
pushax
pushdi
inputNumber_input:
callshowString; вывод строки-приглашения для ввода
movdi, offset buffer; указатель на буфер ввода
calldo_inputNumber
callwriteLine; перевод строки
jncinputNumber_exit; если нет ошибки ввода, выход
inputNumber_error:
pushdx
movdx, si; сообщение об ошибке
callshowString
popdx
jmpshort inputNumber_input
inputNumber_exit:
popdi
mov [di], al; запомнить результат ввода в переменной-получателе
popax
ret
inputNumberendp
; - -----------------------------------------------------------------------------------------
; Ввод числа.
; Вводятся беззнаковые целые числа в диапазоне 0. .65535.
;
; Параметры:
; bx - максимально допустимое значение
; cl - максимально допустимое количество символов
; es: di - указатель на буфер ввода
; первый байт буфера резервируется для записи максимально допустимого количества символов
; второй байт буфера резервируется для записи количества реально введенных символов
;
; Возвращаемое значение:
; 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