Лабораторный практикум
«Начала программирования на языке Assembler»
доцента кафедры ИВТ Гродненского госуниверситета
канд. техн. наук Ливак Елены Николаевны
Лабораторная работа №4 (контрольная)
1. Разберитесь с предложенной программой.
2. Внесите в исходный текст программы свои комментарии (возле помеченных ***** команд - обязательно, в остальных - по желанию)
Замечание Избегайте комментариев типа:
je KONECvvoda ; переход на метку KONECvvoda
int 21h ; вызов 21 прерывания
mov ah,0 ; записать 0 в регистр ah
3. Создайте исполняемый файл.
4. Запустите программу в отладчике.
Разместите на экране кроме окна Module с командами программы окна Dump (для просмотра записи введенного числа в сегмент данных) и Registers (для просмотра изменений содержимого регистров в ходе пошагового выполнения программы).
5. Выполняя программу в пошаговом режиме, протестируйте программу на следующих значениях: 1; 10; 1000; -1; -1000.
Замечание. Каждый раз следите за изменениями содержимого регистров ax, bx, cx, dx, si. Проследите запись результата в сегмент данных.
6. Ответьте на контрольные вопросы (письменно).
7. Продемонстрируйте преподавателю работу программы в пошаговом режиме и в обычном.
8. Внесите предложенные (см. ниже) изменения в программу. Для каждого пункта создайте исполняемый файл, протестируйте каждого исполняемого файла.
Для самопроверки необходимо выполнить исходную программу в соответствии с порядком работы, внести изменения в соответствии с заданиями и протестировать работу всех программ.
Для контроля преподавателем необходимо выполнить исходную программу в соответствии с порядком работы, внести изменения в соответствии с заданиями, произвести тестирование всех программ, продемонстрировать преподавателю их работу, отвечая на вопросы преподавателя.
Программа осуществляет посимвольный ввод десятичного числа и его запись в переменную N размером в слово.
Число в диапазоне WORD задается без ошибок, причем не менее одной цифры.
Перед числом возможен знак «+» или «¾».
Ввод числа закачивается нажатием клавиши Enter.
Masm
model small
.data
N dw ?
.stack
db 128 dup(?)
.code
start:
mov ax,@data
mov ds,ax
mov si,1
mov ah,01h
int 21h
cmp al,'+'; *****
je PERVdigit
cmp al,'-'
jne BEZzn
mov si,0 ; *****
PERVdigit: int 21h ; *****
BEZzn: sub al,30h ; ******
cbw ; *****
mov cx,ax ; *****
mov bx,10 ; *****
CYKL: mov ah,01h ; *****
int 21h
cmp al,0dh ; *****
je KONECvvoda ; *****
sub al,30h
mov ah,0 ; *****
xchg ax,cx ; *****
; *****
mul bx ; *****
add cx,ax ; *****
jmp CYKL
KONECvvoda : cmp si,1
je REZ
NEG cx; *****
REZ : mov N,cx; *****
mov ax,4C00h ; *****
int 21h
end start
1. Чему равен адрес сегмента кода программы?
2. Как узнать смещение следующей выполнимой команды?
3. В какой момент окно Dump настроено на сегмент данных выполнимой программы? Почему?
4. По какому адресу располагается число N?
5. Каковы длины команд
mov si,1;
int 21h ;
je PERVdigit ?
6. Как узнать длину команды?
7. В каких случаях при выполнении данной программы значение регистра si равно 0?
8. Что означает z=0; p=0; d=0 в окне Regs после выполнения команды sub al,30h?
9. Что означает значение 000А в регистре bx?
10. Почему после выполнения команды CYKL: mov ah,01h значением регистра ax является 0102?
11. В какой момент значением регистра ax является 010D?
12. Сколько байт сегмента данных программы «занято»
- в начале выполнения программы
- после записи по адресу N?
Внесите следующие изменения в программу (расположены в порядке сложности).
Замечание Для каждого пункта создайте свой исполняемый файл.
A. Необходимо вывести пользователю сообщение о том, что больше 5 цифр вводить нельзя, приглашение к вводу числа, а также сообщение о завершении работы программы (с задержкой).
B. Необходимо предоставить пользователю возможность вводить различные числа до тех пор, пока он не ответит N на вопрос «Продолжить? (Y/N)». В этом варианте следует предусмотреть ввод числа без эхосопровождения и вывод введенного числа: «Ваше число - ...»
C. В варианте В необходимо очищать экран перед вводом нового числа, делать разбивку на строки (для этого следует пользоваться функциями прерывания 10h).
D. Необходимо реализовать следующее: как только пользователь введет число, выходящее за пределы диапазона, поддерживаемого программой, вывести сообщение об этом и произвести запрос на продолжение работы.
E. Необходимо реализовать программу, осуществляющую посимвольный ввод десятичного числа в диапазоне 4 байт.