Считывание исходных данных и проверка на диапазон — КиберПедия 

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Считывание исходных данных и проверка на диапазон

2019-08-04 100
Считывание исходных данных и проверка на диапазон 0.00 из 5.00 0 оценок
Заказать работу

 

Далее в цикле три раза считываем исходные данные в переменные 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.056 с.