Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

9Aad в сегмент данных. В угловых скобках может находиться значение,

переопределяющее BITREC.

Программа на рис.24.1 иллюстрирует определение BITREC директивой

RECORD, но без начальных значений. В этом случае соответствующий оператор

в сегменте данных инициализирует каждое поле операндом в угловых скобках.

Дополнительно к директиве RECORD имеются операторы WIDTH, MASK и

фактор сдвига. Использование этих операторов позволяет изменять

определение директивы RECORD без изменения команд, которые имеют ссылки на

директиву RECORD.

О п е р а т о р WIDTH. Оператор WIDTH возвращает число битов в

директиве RECORD или в одном из ее полей. На рис.24.1 после метки А10

имеется два примера оператора WIDTH. Первая команда MOV загружает в

регистр BH число битов во всем поле RECORD BITREC (16 бит); вторая команда

MOV загружает в регистр AL число битов в поле BIT2 (7 бит). В обоих

случаях ассемблер генерирует для числа битов непосредственный операнд.

__________________________________________________________________________

TITLE RECORD (COM) Проверка директивы RECORD

0000 CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG

0100 ORG 100H

0100 EB 02 BEGIN: JMP SHORT MAIN

; -----------------------------------------------------

BITREC RECORD BIT1:3,BIT2:7,BIT3:6 ;Определить запись

0102 9A AD DEFBITS BITREC <101B,0110110B,011010B> ;Инициализировать биты

; -----------------------------------------------------

0104 MAIN PROC NEAR

0104 A10: ;Ширина:

0104 B7 10 MOV BH,WIDTH BITREC ; записи (16)

0106 B0 07 MOV AL,WIDTH BIT2 ; поля (07)

0108 B10: ;Величина сдвига:

0108 B1 0D MOV CL,BIT1 ; шест.0D

010A B1 06 MOV CL,BIT2 ; 06

010C B1 00 MOV CL,BIT3 ; 00

010E C10: ;Маска:

010E B8 E000 MOV AX,MASK BIT1 ; шест.E000

0111 BB 1FC0 MOV BX,MASK BIT2 ; 1FC0

0114 B9 003F MOV CX,MASK BIT3 ; 003F

0117 D10: ;Выделение BIT2:

0117 A1 0102 R MOV AX,DEFBITS ; получить запись,

011A 25 1FC0 AND AX,MASK BIT2 ; очистить BIT1 и BIT3,

011D B1 06 MOV CL,BIT2 ; получить сдвиг 06,

011F D3 E8 SHR AX,CL ; сдвинуть вправо

0121 E10: ;Выделение BIT1:

0121 A1 0102 R MOV AX,DEFBITS ; получить запись,

0124 B1 0D MOV CL,BIT1 ; получить сдвиг 13,

0126 D3 E8 SHR AX,CL ; сдвинуть вправо

0128 C3 RET

0129 MAIN ENDP

0129 CODESG ENDS

END BEGIN

_____________________________________________________________________

Structures and records:

N a m e Widht # fields

Shift Widht Mask Initial

BITREC . . . . . . . . . . . 0010 0003

BIT1 . . . . . . . . . . . . 000D 0003 E000 0000

BIT2 . . . . . . . . . . . . . 0006 0007 1FC0 0000

BIT3 . . . . . . . . . . . . 0000 0006 003F 0000

Segments and Groups:

N a m e Size Align Combine Class

CODESG . . . . . . . . . . . . 0129 PARA NONE 'CODE'

Symbols:

N a m e Type Value Attr

A10. . . . . . . . . . . . . . L NEAR 0104 CODESG

B10. . . . . . . . . . . . . . L NEAR 0108 CODESG

BEGIN. . . . . . . . . . . . . L NEAR 0100 CODESG

C10. . . . . . . . . . . . . . L NEAR 010E CODESG

D10. . . . . . . . . . . . . . L NEAR 0117 CODESG

DEFBITS. . . . . . . . . . . . L WORD 0102 CODESG

E10. . . . . . . . . . . . . . L NEAR 0121 CODESG

MAIN . . . . . . . . . . . . . N PROC 0104 CODESG Length =0025

__________________________________________________________________________

Рис.24.1. Использование диpективы RECORD

Ф а к т о р с д в и г а. Прямая ссылка на элемент в RECORD,например:

MOV CL,BIT2

в действительности не имеет отношения к содержимому BIT2. Вместо этого

ассемблер генерирует непосредственный операнд, который содержит "фактор

сдвига", помогающий изолировать необходимое поле. Непосредственное

значение представляет собой число, на которое необходимо сдвинуть BIT2 для

выравнивания справа. На рис.24.1 после метки В10 имеются три команды,

которые загружают в регистр CL фактор сдвига для полей BIT1, BIT2 и BITЗ.

О п е р а т о р MASK. Оператор MASK возвращает "маску" из единичных

битовых значений, которые представляют специфицированное поле, иными

словами, определяют битовые позиции, которые занимает поле. Например,

оператор MASK для каждого из полей, определенных в области BITREC,

возвращает следующие значения:

Поле Двоичное значение Шестнадцатиричное значение

В1Т1 1110000000000000 Е000

В1Т2 0001111111000000 1FC0

В1ТЗ 0000000000111111 003F

На рис.24.1 три команды после метки С10 загружают в регистры значения

оператора MASK для полей BIT1, BIT2 и BITЗ. Команды после меток D10 и Е10

иллюстрируют выделение значений полей BIТ2 и BIТ1 соответственно из

области BITREC. После метки D10 в регистр АХ загружается все значение

области, определенной директивой RECORD, а затем из этого значения с

помощью оператора MASK выделяются только биты поля BIТ2:

Область RECORD: 101 0110110 011010

AND MASK BIТ2: 000 1111111 000000

Результат: 000 0110110 000000

В результате сбрасываются все биты, кроме принадлежащих к полю BIТ2.

Следующие две команды приводят к сдвигу содержимого регистра АХ на шесть

битов для выравнивания справа:

0000000000110110 (0036Н)

После метки Е10 в регистр AХ загружается все значение области,

определенной директивой RECORD, и так как BIТ1 является самым левым полем,

то в примере используется только фактор для сдвига значения вправо на 13

бит:

0000000000000101 (0005Н)

Директива SEGMENT

-------------------

Ассемблерный модуль может состоять из одного или более сегментов,

части сегмента или даже частей нескольких сегментов. Формат директивы:

имя_сегмента SEGMENT [выравнивание] [объединение] [класс]

.

.

.

имя_сегмента ENDS

Все операнды являются необязательными. Ниже описаны операнды для

выравнивания, объединения и указания класса.

В ы р а в н и в а н и е. Операнд выравнивания определяет начальную

границу сегмента, например

PAGE = xxx00

PARA = хххх0 (граница по умолчанию)

WORD = ххххe (четная граница)

BYTE = ххххх

где х - любая шестнадцатиричная цифра,

е - четная шестнадцатиричная цифра.

О б ъ е д и н е н и е. Операнд объединения указывает способ обработки

сегмента, при компоновке:

NONE: Значение по умолчанию. Сегмент должен быть логически отделен от

других сегментов, хотя физически он может быть смежным.

Предполагается, что сегмент имеет собственный базовый адрес;

PUBLIC: Все PUBLIC - сегменты, имеющие одинаковое имя и класс,

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

один общий базовый адрес;

STACK: Для компоновщика операнд STACK аналогичен операнду PUBLIC. В

любой компонуемой программе должен быть определен по крайней мере

один сегмент STACK. Если объявлено более одного стека, то стековый

указатель (SP) устанавливается на начало первого стека;

COMMON: Для сегментов COMMON с одинаковыми именами и классами

компоновщик устанавливает один общий базовый адрес. При выполнении

происходит наложение второго сегмента на первый. Размер общей области

определяется самым длинным сегментом;

AT-параграф: Параграф должен быть определен предварительно. Данный

операнд обеспечивает определение меток и переменных по фиксированным

адресам в фиксированных областях памяти, таких, как ROM или таблица

векторов прерываний в младших адресах памяти. Например, для

определения адреса дисплейного видеобуфера используется