помощью оператора 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 или таблица
векторов прерываний в младших адресах памяти. Например, для
определения адреса дисплейного видеобуфера используется
VIDEO_RAM SEGMENT AT 0B800H
Класс: Операнд класс может содержать любое правильное имя,
заключенное в одиночные кавычки. Данный операнд используется
компоновщиком для обработки сегментов, имеющих одинаковые имена и
классы. Типичными примерами являются классы 'STACK' и 'CODE'.
Следующие два сегмента объединяются компоновщиком в один физический
сегмент при одном значении сегментного регистра:
--------------------------------
Ассемблерный SEG1 SEGMENT PARA PUBLIC 'CODE'
модуль 1 ASSUME CS:SEG1
...
SEG1 ENDS
--------------------------------
Ассемблерный SEG2 SEGMENT PARA PUBLIC 'CODE'
модуль 2 ASSUME CS:SEG1
...
SEG2 ENDS
--------------------------------
Сегменты могут быть вложенными один в другой:
SEG1 SEGMENT
... Начало SEG1
SEG2 SEGMENT
... Область SEG2
SEG2 ENDS
... Конец SEG1
SEG1 ENDS
Для объединения сегментов в группы используйте директиву GROUP.
Директива STRUC
-----------------
Директива STRUC обеспечивает определение различных полей в виде
структуры. Данная директива не поддерживается в малом ассемблере ASM.
Формат директивы:
Имя-структуры STRUC
...
[определение полей данных]
...
Имя-структуры ENDS
Структура начинается собственным именем в директиве STRUC и
завершается таким же именем в директиве ENDS. Ассемблер записывает поля;
определенные в структуре, одно за другим от начала структуры. Правильными
операторами определения полей являются DB, DW, DD и DT с указанием имен
или без них.
На рис.24.2 директива STRUC определяет список параметров PARLIST для
ввода имени с клавиатуры. Следующий далее оператор выделяет память под
данную структуру:
PARAMS PARLIST <>
Данный оператор обеспечивает адресацию структуры внутри программы. Угловые
скобки (символы меньше и больше) в данном случае пусты, но в них можно
указать данные для переопределения областей внутри структуры.
В командах ассемблера может использоваться прямая адресация по имени
структуры. Для ссылки на определенное поле внутри структуры в командах
используется имя структуры (PARAMS в данном примере) и через точку имя
конкретного поля:
MOV AL,PARAMS.ACTLEN
Используя оператор выделения памяти, можно переопределить содержимое
полей внутри структуры. Правила для практического использования этой
возможности можно найти в руководстве по Ассемблеру.
__________________________________________________________________________
TITLE DSTRUC (COM) Определение структуры
0000 CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG
0100 ORG 100H
0100 EB 29 BEGIN: JMP SHORT MAIN
; ---------------------------------------------
PARLIST STRUC ;Список параметров
0000 19 MAXLEN DB 25 ;
0001 ?? ACTLEN DB ? ;
0002 19 [ 20 ] NAMEIN DB 25 DUP(' ') ;
001B PARLIST ENDS
;
0102 19 PARAMS PARLIST <> ;Область структуры
0103 ??
0104 19 [ 20 ]
011D 57 68 61 74 20 69 PROMPT DB 'What is name?', 'S'
73 20 6E 61 6D 65
3F 24
; ---------------------------------------------
012B MAIN PROC NEAR
012B B4 09 MOV AH,09 ;Выдать запрос
012D 8D 16 011D R LEA DX,PROMPT
0131 CD 21 INT 21H
0133 B4 0A MOV AH,0AH ;Получить ввод
0135 8D 16 0102 R LEA DX,PARAMS
0139 CD 21 INT 21H
013B A0 0103 R MOV AL,PARAMS.ACTLEN ;Длина ввода
; ...
013E C3 RET
013F MAIN ENDP
013F CODESG ENDS
END BEGIN
Structures and records:
N a m e Width # fields
Shift Width Masc Initial
PARLIST. . . . . . . . . . . . . 001B 0003
MAXLEN . . . . . . . . . . . . 0000
ACTLEN . . . . . . . . . . . . 0001
NAMEIN . . . . . . . . . . . . 0002
Segments and Groups:
N a m e Size Align Combine Class
CODESG . . . . . . . . . . . . . 013F PARA NONE 'CODE'
Symbols:
N a m e Type Value Attr
BEGIN. . . . . . . . . . . . . L NEAR 0100 CODESG
MAIN . . . . . . . . . . . . . N PROC 012B CODESG Length =0014
PARAMS . . . . . . . . . . . . L 001B 0102 CODESG
PROMPT . . . . . . . . . . . . L BYTE 011D CODESG
__________________________________________________________________________
Рис.24.2. Пpимеp опpеделения стpуктуpы
ГЛАВА 25 Справочник по командам языка Ассемблер
__________________________________________________________________________
Ц е л ь: описать набор команд Ассемблера и объяснить их машинные
коды.
ВВЕДЕНИЕ
________________________________________________________________
В данной главе приведены объяснения машинных кодов и перечислены в
алфавитном порядке символические коды команд с указанием их назначений.
Многие специфические команды имеют однобайтовые машинные коды,
например:
Объектный код: Символические команды:
40 INC AX ;Увеличение AX на 1
50 PUSH AX ;Запись AХ в стек
С3 RET (short) ;Короткий возврат из процедуры
CB RET (far) ;Длинный возврат из процедуры
FD STD ;Остановка флага направления
Ни одна из перечисленных команд не использует прямой адресации
памяти. Другие команды, использующие непосредственный операнд, 8-битовый
регистр, регистровую пару или адрес памяти, требуют более сложного
машинного кода.
ОБОЗНАЧЕНИЕ РЕГИСТРОВ
________________________________________________________________
Команды, использующие регистр, могут содержать три бита, указывающих
на конкретный регистр, и один бит "w", определяющий размер регистра: байт
или слово. Кроме того, лишь некоторые команды обеспечивают доступ к
сегментным регистрам. На рис.25.1 показана полная идентификация регистров.
Рассмотрим команду MOV с однобайтовым непосредственным операндом:
MOV АН,00 10110 100 00000000
| |
w rеg = AН
__________________________________________________________________________
Основные, базовые и индексные регистры:
Биты: w = 0 w = 1
000 AL AX
001 CL CX
010 DL DX
011 BL BX
100 AH SP
101 CH BP
110 DH SI
111 BH DI
Биты: Сегментный регистр:
00 ES
01 CS
10 SS
11 DS
__________________________________________________________________________
Рис.25.1. Обозначение регистров
В данном случае первый байт машинного кода указывает на однобайтовый
размер (w = 0) и на регистр AН (100). Следующая команда MOV содержит
непосредственный двухбайтовый операнд:
MOV AX,00 10111 000 00000000 00000000