Лабораторный практикум

«Начала программирования на языке Assembler»

доцента кафедры ИВТ Гродненского госуниверситета

канд. техн. наук Ливак Елены Николаевны

 

Лабораторная работа №4 (контрольная)

Ввод-ВЫвод на языке Assembler

 

 

Порядок выполнения и методические указания

 

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 байт.