Главная страница
Навигация по странице:

  • Цель работы

  • Лабораторная работа 3 " Режимы адресации и команды перехода (метки и переменные) " Сиразетдинова А. Р. Факультет оф


    Скачать 90.35 Kb.
    НазваниеЛабораторная работа 3 " Режимы адресации и команды перехода (метки и переменные) " Сиразетдинова А. Р. Факультет оф
    Дата05.11.2018
    Размер90.35 Kb.
    Формат файлаdocx
    Имя файла№3.docx
    ТипЛабораторная работа
    #55422

    МИНОБРНАУКИ РОССИИ

    САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ

    ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

    «ЛЭТИ» ИМ. В.И.УЛЬЯНОВА (ЛЕНИНА)

    Кафедра вычислительной техники

    Лабораторная работа №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. Также в ходе работы были закреплены навыки использования различных режимов адресации: в данной работе использовались непосредственная, регистровая, косвенная и косвенная со смещением адресации. В ходе работы мы также ознакомились со структурой написания программы на ассемблере, в которой для указания адреса начала зацикливаемых кодов в сегменте кода использовались так называемые метки.


    написать администратору сайта