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.
Рассмотрим их.
2.2 Запись данных в массивы
Передаем в стек параметры, т.е. переменные а и b, и вызываем процедуру находящуюся в модуле.
Исходный текст модуля представлен в приложении А.
Делаем сравнение переменных выполняем соответствующие арифметически операции, результат заносим в переменную y1 и возвращаемся в вызывающую программу.
2.3 Запись данных в массивы
Так как для типа переменных мы использовали 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.
2.4 Вывод значения переменной на дисплей
При помощи деления на десять отделяем по одной цифре и выводим ее на дисплей.
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
В конце делаем перевод каретки и следим за переполнениями.
3. Строки
При запуске программы выводим приглашение говорящее, что максимальное кол-во символов в строке 255.
3.1 Записываем введенную строку в массив байт
Делаем это в цикле, пока пользователь не нажмет 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:
Далее вызываем процедуру.
3.2 Процедура подсчета первой цифры
Просто просматриваем и сравниваем символы являются ли они цифрами, если да, то запоминаем номер и возвращаем его в вызывающую программу.
Соответствующий код представлен в приложении B.
3.3 Вывод результата
Если результат нулевой, то символа нам нужного в строке не было. Выводим сообщение об этом.
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.