Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...
Топ:
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Интересное:
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Дисциплины:
2019-08-04 | 100 |
5.00
из
|
Заказать работу |
|
|
Далее в цикле три раза считываем исходные данные в переменные a и b. И проверяем, чтобы они были в диапазоне от 0 до 65535. В противном случае переходим на следующий проход цикла и выдаем соответсвующее предупреждение на дисплей.
Это делается в следующем фрагменте кода:
k3:
cmp i, 3
je k2
mov di, 0; Пока ничего не введено, считаем что 0
mov si, 0; Номер позиции в числе
mov bp, 10; Потом будем умножать на 10
z1: mov ah, 01h
int 21h; Читаем символ
cmp al, '0'; Если это служебный символ -> r3
jb z2
cmp al, '9'; Если это не цифра -> r1
ja z5
mov bl, al; Сохраним символ в bl
mov ax, di
mul bp; Умножаем на 10
cmp dx, 0
jne z5; Если не 0 в DX -> переполнение
mov dl, bl
sub dl, '0'; Преобразуем символ в цифру
mov dh, 0; DX – цифра
add dx, ax
jc z5; Если перенос -> переполнение
inc si
mov di, dx
jmp z1
z2:
cmp si, 0
je z5
cmp al, 13
je enter1
jmp z1
enter1:
mov ah, 2h
mov dl, 13
int 21h
mov ah, 2h
mov dl, 10
int 21h
mov a, di
jmp z6
z5:
mov ah, 2h
mov dl, 13
int 21h
mov ah, 2h
mov dl, 10
int 21h
mov ah, 09h
mov dx, offset str2
int 21h
mov ah, 2h
mov dl, 13
int 21h
mov ah, 2h
mov dl, 10
int 21h
inc i
jmp k3
z6:
mov di, 0; Пока ничего не введено, считаем что 0
mov si, 0; Номер позиции в числе
mov bp, 10; Потом будем умножать на 10
|
x1: mov ah, 01h
int 21h; Читаем символ
cmp al, '0'; Если это служебный символ -> r3
jb x2
cmp al, '9'; Если это не цифра -> r1
ja x5
mov bl, al; Сохраним символ в bl
mov ax, di
mul bp; Умножаем на 10
cmp dx, 0
jne x5; Если не 0 в DX -> переполнение
mov dl, bl
sub dl, '0'; Преобразуем символ в цифру
mov dh, 0; DX – цифра
add dx, ax
jc z5; Если перенос -> переполнение
inc si
mov di, dx
jmp x1
x2:
cmp si, 0
je z5
cmp al, 13
je enter2
jmp z1
enter2:
mov ah, 2h
mov dl, 13
int 21h
mov ah, 2h
mov dl, 10
int 21h
mov b, di
jmp x6
x5:
mov ah, 2h
mov dl, 13
int 21h
mov ah, 2h
mov dl, 10
int 21h
mov ah, 09h
mov dx, offset str2
int 21h
mov ah, 2h
mov dl, 13
int 21h
mov ah, 2h
mov dl, 10
int 21h
inc i
jmp k3
x6:
Вначале считываем переменную A, а затем, если предыдущее чтение закончилось успешно, то считываем переменную B.
Рассмотрим их.
Запись данных в массивы
Передаем в стек параметры, т.е. переменные а и b, и вызываем процедуру находящуюся в модуле.
Исходный текст модуля представлен в приложении А.
Делаем сравнение переменных выполняем соответствующие арифметически операции, результат заносим в переменную y1 и возвращаемся в вызывающую программу.
Запись данных в массивы
Так как для типа переменных мы использовали 2 байта, то индексируем массив через один, чтобы на каждый элемент так же отводилось по два байта.
cmp i, 1
je t1
ja t2
mov ax, a
mov sourcea, ax
mov ax, b
mov sourceb, ax
mov ax, y1
mov dest, ax
jmp t3
t1:
mov ax, a
mov sourcea+2, ax
mov ax, b
mov sourceb+2, ax
mov ax, y1
mov dest+2, ax
jmp t3
t2:
mov ax, a
mov sourcea+4, ax
mov ax, b
mov sourceb+4, ax
|
mov ax, y1
mov dest+4, ax
t3:
inc i
Далее посимвольно выводим на дисплей содержимое переменной y1.
Вывод значения переменной на дисплей
При помощи деления на десять отделяем по одной цифре и выводим ее на дисплей.
mov ax, y1; Выводимое число в регисте AX
push -1; Сохраним признак конца числа
mov cx, 10; Делим на 10
l:mov dx, 0; Очистим регистр dx
div cx; Делим
push dx; Сохраним цифру
cmp ax, 0; Остался 0? (оптимальнее or ax, ax)
jne l; нет -> продолжим
mov ah, 2h
l2:pop dx; Восстановим цифру
cmp dx, – 1; Дошли до конца -> выход
je ex
add dl, '0'; Преобразуем число в цифру
int 21h; Выведем цифру на экран
jmp l2; И продолжим
ex:
mov ah, 02h перейдем на новую строчку
mov dl, 13
int 21h
mov dl, 10
int 21h
В конце делаем перевод каретки и следим за переполнениями.
Строки
При запуске программы выводим приглашение говорящее, что максимальное кол-во символов в строке 255.
Записываем введенную строку в массив байт
Делаем это в цикле, пока пользователь не нажмет Enter или не наберет 255 символов.
mov i, 0
mov si, 0
z0:
cmp i, 255
je z1
mov ah, 01h
int 21h;
cmp al, 13;
je z1
mov dest[si], al
inc i
inc si
jmp z0;
z1:
Далее вызываем процедуру.
Процедура подсчета первой цифры
Просто просматриваем и сравниваем символы являются ли они цифрами, если да, то запоминаем номер и возвращаем его в вызывающую программу.
Соответствующий код представлен в приложении B.
Вывод результата
|
Если результат нулевой, то символа нам нужного в строке не было. Выводим сообщение об этом.
cmp number, 0
je z5
mov al, number;
push -1;
mov cx, 10;
l:mov dx, 0;
div cx;
push dx;
cmp ax, 0;
jne l;
mov ah, 2h
l2:pop dx;
cmp dx, – 1;
je ex
add dl, '0';
int 21h;
jmp l2;
ex:
jmp z6
z5:
mov ah, 09h
mov dx, offset str2
int 21h
z6:
mov ax, 4c00h; Выход
int 21h
Иначе выводим номер символа.
4. Контрольный пример
Запускаем приложение для подсчета функции и вводим:
16
16
В ответ получаем – 25
0
1
В ответ получаем – -5
200000
В ответ получаем – Wrong input!!!
Значит программа работает корректно.
Запускаем приложение для подсчета номера цифры и вводим:
Abc1c
В ответ получаем – 4
Abcd
В ответ получаем – No digit in this line!
Значит программа работает корректно.
Заключение
В данной курсовой работе были реализованы две программы, одна для вычисления функции с вводом и выводом данных в таблицу и на дисплей, и проверки диапазона исходных данных, другая – для нахождения номера первого символа в строке с вводом исходных данных и проверки их корректности.
Так как основные действия были разбиты на модули – это значительно упростило модификацию и отладку программы.
Рассмотрены основные особенности языка ассемблера и низкоуровневых языков в частности.
Перечень литературы
1. Юров В.И. «Assembler: учебный курс». – СПб: Питер, 2000.
2. Пирогов В.Ю. «Ассемблер MASM32. Программирование». – СПб: Питер, 2002.
|
3. Д. Кнут. «Искусство программирования». Том 1.
4. Д. Кнут. «Искусство программирования». Том 2.
5. Д. Кнут. «Искусство программирования». Том 3.
|
|
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...
Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!