Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_2011.doc
Скачиваний:
64
Добавлен:
09.12.2018
Размер:
1.15 Mб
Скачать

Пример:

Переслать поле name в область памяти

.data

sotr1 worker <'Иванов','инженер'>

mas db 6 dup('')

.code

assume ds:@data, es:@data

mov ax, @data

mov ds, ax

move es,ax

lea si, sotr1.name

lea di, mas

mov cx,6

rep movs b ;записать поле ‘Иванов” в память mas

  1. Записи

Это структурный тип данных, состоящий из фиксированного числа элементов длиной от 1 до нескольких бит. При описании записи для каждого элемента указывается его длина в битах и значение этих бит(не обязательно).

Суммарный размер записи определяется суммой размеров её полей и не может быть более 8,16 или32 бит.

Если суммарный размер меньше указанного значения, то все поля записи смещаются к младшим разрядам.

При работе с записями используются 3 этапа:

  1. Задание шаблона записи

  2. Определение экземпляра записи

  3. Организация обращения к записи (обращение к отдельным битам)

Шаблон записи:

имя записи RECORD <описание элементов>

IOTEST RECORD I1:1, I2:2=11, I3:1, I4:2=11, I5:2=00

После двоеточия указывается количество разрядов (бит) для каждого элемента записи.

Для получения экземпляра записи используются варианты:

  • FLAG IOTEST ? все элементы записи=0

  • FLAG1 IOTEST <> ; в качестве экземпляра выбирается шаблон

  • FLAG2 IOTEST <,10,>; вносится I2=10 вместо I2=11, остальные по шаблону

  • FLAG3 IOTEST {I2=10} ; выборочная инициализация

Для работы с записями Assembler поддерживает ряд операций.

Каждому имени элемента записи Assembler присваивает числовое значение, равное смещению (в битах) элемента от правой границы записи.

Assembler предлагает оператор width, который позволяет определить размер элемента записи в битах, либо полностью размер записи.

Пример:

mov al, width I2

mov ax, width IOTEST; в ax размер записи в битах

Оператор mask позволяет локализовать биты нужного элемента записи.

Размер маски совпадает с размером записи. В маске обнулены все разряды, кроме тех, которые выделяют элементы записи.

Используя возможности Assembler рекомендуется работать с записью в следующей последовательности:

  1. Выделить элемент с помощью оператора mask

  2. Сдвинуть при необходимости вправо или влево

  3. Выполнить требуемые действия

  4. Поместить элемент на свое место записи

Пример:

masm

model small

.stack 256

iotest record i1:1, i2:2=11, i3:1, i4:2=11, i5:2=00

.data ; сегмент данных

flag iotest <> ; экземпляр записи

.code

main:

mov ax, @data

mov ds, ax

mov al, mask i2 ; 01100000

shr al, i2 ; 00000011

and al, 11111100b ; обнуление младшего разряда

shl al, i2

mov bl, [flag] ; содержимое flag помещается в bl

Xor bl, mask i2 ; обнуление

or bl,al ; запись в bl содержимого al

mov ax, 4c00h; выход

int 21h

end main

  1. Команды передачи управления

Обычно в программе есть точки, в которых нужно принять решение о том, какая команда будет выполняться следующей.

Команды процессора, обеспечивающие организацию переходов в программе, можно разделить на три группы.

  • Команды безусловной передачи управления:

  1. безусловного перехода;

  2. вызова процедуры и возврата из процедуры;

  3. вызова программных прерываний и возврата из программных прерываний.

  • Команды условной передачи управления:

    1. переходы по результату команды сравнения;

    2. переходу по состояния определенного флага;

    3. переходу по содержимому регистра ecx/cx.

  • Команды управления циклом:

    1. организация цикла со счетчиком ecx/cx;

    2. организация цикла с возможностью досрочного выхода из цикла.

    В языке ассемблера передача управления выполнятся с помощью меток.

    Транслятор ассемблера присваивает метке три атрибута:

    - имя сегмента кода;

    - смещение от начального сегмента кода;

    - тип или атрибут расстояния метки.

    Последний атрибут может принимать два значения:

    near - ближний тип метки:

    при передаче управления изменяется содержимое регистра счетчика команд ip/eip. Метка находится в том же сегменте, что и команда передачи управления.

    farдальний тип метки:

    метка располагается в другом сегменте (не там, где команда передачи управления). При передаче управления изменяется содержимое 2-х регистров: cs и eip/ip.

    Метку можно определить двумя способами:

    • <имя>:

    • директивой label.

    Оператор : (двоеточие) может определить только ближнюю метку,

    а директива label - любой тип метки.

    Одно и то же место в коде может быть отмечено как ближней, так и дальней меткой, но с различными именами. По умолчанию метка - ближняя.

    Пример:

    public mfar ;метка объявлена видимой для других сегментов

    …………..

    mfar label far ; метка определена как дальняя

    mnear: ; метка определена как ближняя

    mov ax,cx

    На команду mov ax,cx можно передать управление как из данного сегмента команд, так и из других сегментов, принадлежащих другим модулям.

  • Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]