Лабораторная работа 3 " Режимы адресации и команды перехода (метки и переменные) " Сиразетдинова А. Р. Факультет оф
![]()
|
![]() ![]() ![]() ![]() САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И.УЛЬЯНОВА (ЛЕНИНА) Кафедра вычислительной техники Лабораторная работа №3 “ Режимы адресации и команды перехода (метки и переменные) ” Выполнил: Сиразетдинова А.Р. Факультет: ОФ Группа №: 6892 Преподаватель: Валов А. А. Санкт Петербург 2018 Цель работы: изучение правил адресации команд и данных. Задача 1. Содержимое первого байта памяти данных, представленных в окне наблюдения двумя первыми слева шестнадцатеричными цифрами в исходной строке, переместить в первый байт памяти данных, представленных в окне наблюдения двумя первыми слева шестнадцатеричными цифрами результирующей строки. Затем аналогично содержимое памяти 2-го байта переместить во 2-ой байт памяти и т. д. Исходный код программы: TITLE LAB3-1; задание программе имени LAB3-1 data segment; начало описания сегмента данных с именем data a DB 0,1,2,3,4,5,6,7; определение массива a, каждый элемент которого весом в ; байт b DB 8 dup(?); определение массива b, содержащего 8 неинициализированных ; элементов, каждый из которых весом в байт data ends; конец описания сегмента данных data code segment; начало описания сегмента кода code assume cs:code, ds:data ; директива, устанавливающая связь между ; сегментами и сегментными регистрами CS, DS begin: mov ax,data mov ds,ax ; помещение данных сегмента data в сегментный регистр ds mov cx,8; помещение значения 8 счетчику mov si,0; помещение начальных значений адресов исходной mov di,8; и результирующей строк соответственно m1: ; метка m1, запоминающая адрес строки кода для последующего зацикливания кода mov al,[si] mov [di],al; помещение в ячейку с адресом в di значения ячейки с адресом в si inc si; инкрементация регистра si inc di loop m1; зацикливание кода с адреса m1 в сегменте кода для копирования значений ; ячеек с адресом в si в ячейки с адресом в di mov ax,4c00h; эти 2 команды обязательны для завершения программы и передаче int 21h ; управления DOSу code ends; конец описания сегмента кода code END begin; конец описания программы и указание адреса начала выполнения программы Результат выполненной программы: Задача 2. Из первого байта памяти данных, представленных в исходной строке, переместить данные в восьмой байт результирующей строки. Затем 2-ой байт переместить в 7-ой и т. д. Исходный код программы: TITLE LAB3-2 data segment a DB 0,1,2,3,4,5,6,7 b DB 8 dup(?) data ends code segment assume cs:code, ds:data begin: mov ax,data mov ds,ax mov cx,8 mov si,0 mov di,8 m1: mov al,[si]; помещение в ячейку с адресом в di и добавочным смещением 7 (т.е. mov [di+7],al; в 15ю ячейку относительно начального значения di) значения ; ячейки с адресом в si inc si dec di; декрементация di, т.к. необходимо заполнять ячейки от конца 15 к началу 7 loop m1; зацикливание участка кода с адреса m1 для копирования значений ; ячеек с адресом в si в ячейки с адресом в di+7 mov ax,4c00h; int 21h code ends END begin Результат выполненной программы: Задача 3. Если число в восьмом байте исходной строки больше 5, то переместить это число в восьмой байт результирующей строки. Иначе обнулить восьмой байт. Затем 7-ой байт переместить в 7-ой при выполнении условий, аналогичных рассмотренным выше условиям и т. д. Исходный код программы: TITLE LAB3-3 data segment a DB 0,1,2,3,4,5,6,7 b DB 8 dup(?) data ends code segment assume cs:code, ds:data begin: mov ax,data mov ds,ax mov cx,7 mov si,7 mov di,0Fh m1: cmp [si],5; сравнение значения ячейки с адресом в si с числом 5 jg m2; если значение ячейки > 5, то выполняется “прыжок” к участку кода, ; начинающегося с метки m2, который копирует содержимое ячейки [si] в ячейку [di] mov [si],0; если значение ячейки [si] меньше 5, то она зануляется dec si dec di m3: loop m1; зацикливание участка кода с метки m1 m2: mov al,[si] mov [di],al dec si dec di cmp cx,0; если значение счетчика больше нуля, то происходит переход к участку jg m3 ; кода с m3, который зацикливает участок кода с m1. Это условие ; необходимо для избежания вечного зацикливания mov ax,4c00h; int 21h code ends END begin Результат выполненной программы: Задача 4. Первый байт исходной строки переместить во второй байт результирующей строки. Затем второй байт исходной строки переместить в первый байт результирующей строки. Аналогично переместить третий и четвертый байты исходной строки и т. д. Исходный код программы: TITLE LAB3-4 data segment a DB 0,1,2,3,4,5,6,7 b DB 8 dup(?) data ends code segment assume cs:code, ds:data begin: mov ax,data mov ds,ax mov cx,4; счетчик в 2 раза меньше, поскольку зацикливаемый участок кода ; копирует значения 2х исходных ячеек в 2 результирующие ячейки mov si,0 mov di,8 m1: mov al,[si] mov [di+1],al mov al,[si+1] mov [di],al add si,2; 4 команды выше копируют значения 2х исходных ячеек в 2 add di,2; результирующие ячейки, поэтому необходимо, чтобы копировались ; следующие 2 ячейки после скопированных loop m1 mov ax,4c00h; int 21h code ends END begin Результат выполненной программы: ВЫВОД В ходе работы мы ознакомились с использованием переменных в ассемблере: их значения последовательно заполняют ячейки памяти в сегменте данных, начиная с ds:0000. Также в ходе работы были закреплены навыки использования различных режимов адресации: в данной работе использовались непосредственная, регистровая, косвенная и косвенная со смещением адресации. В ходе работы мы также ознакомились со структурой написания программы на ассемблере, в которой для указания адреса начала зацикливаемых кодов в сегменте кода использовались так называемые метки. |