Директива assume определяет назначение сегментов программы сегментным регистрам, т.е. помогает ассемблеру преобразовать метки и адреса, сообщая, каким регистрам сегмента вы будете пользоваться при адресации этих меток. Например, директива:
assume DS:data
говорит ассемблеру, что сегмент data – это сегмент данных, и когда в программе будут использоваться метки из сегмента data, номер блока метки надо извлекать из регистра DS. Но чтобы это работало, надо чтобы в самом начале программы регистр DS указывал на начало сегмента data.
Директива segment может иметь параметры. По умолчанию сегмент имеет адрес, кратный 16. Смещением байта называется разность между физическим адресом этого байта и адресом начала сегмента программы, содержащего этот байт. Программа состоит из сегментов трех типов:
Сегмент кодов
16:CS
Сегмент данных
16:DS
1
Сегмент стека
6:SS
На схеме слева указаны значения адресов сегментов. Сегменту кодов отводится регистр CS, сегменту данных – регистр DS или ЕS, сегменту стека – регистр SS.
Директивы определения сегмента.
-
.CODE [ИМЯ] – начало сегмента кода
-
.DATA – начало сегмента данных
-
.CONST – начало и продолжение сегмента постоянных данных.
-
.DATA? – начало и продолжение сегмента неинициализированных данных.
-
.STACK – начало и продолжение сегмента стека модуля
******** Встроенный ассемблер Borland Pascal поддерживает три директивы ассемблера:
-
DB (определить байт),
-
DW (определить слово),
-
DD (определить двойное слово).
Каждая из них генерирует данные, соответствующие разделенным запятым операндам, которые следуют за директивой.
Директива DB генерирует последовательность байт. Каждый операнд может представлять собой выражение-константу со значением от -128 до 255, или строку символов любой длины. Выражение-константа генерирует 1 байт кода, а строки генерируют последовательность байт со значениями, соответствующим коду ASCII каждого символа.
Директива DW генерирует последовательность слов. Каждый операнд может представлять собой выражение-константу со значением от -32768 до 65535, или адресное выражение. Для адресного выражения встроенный ассемблер генерирует указатель ближнего типа, что есть слово, содержащие смещения адреса.
Директива DD генерирует последовательность двойных слов. Каждый операнд может представлять собой выражение-константу со значением от -2147483648 до 4294967295 или адресное выражение. Для адресного выражения встроенный ассемблер генерирует указатель дальнего типа, что есть слово, содержащие смещения адреса, за которым следует слово, содержащее сегментную часть адреса.
Данные, генерируемые по директивам DB, DW и DD, всегда записываются в сегмент кода, аналогично коду, генерируемому другими операторами встроенного ассемблера. Чтобы сгенерировать инициализированные или неинициализированные данные в сегменте данных, вам следует использовать обычные описания Паскаля типа var или const.
Приведем некоторые примеры директив DB, DW и DD:
ASM
DB 00FH {1 байт}
DB 0, 99 {2 байта}
DB 'A' {Ord('A’)}
DB 'Пример',0DH,OAH {строка, за которой следуют возврат
каретки и перевод строки}
DB12,"BorlandPascal" {строка Паскаля}
DW 0FFFFH {1 слово}
DW 0,9999 {2 слова}
DW 'A' {эквивалентноDB'A',0}
DW 'BA' {эквивалентно DB'A','B'}
DW MyVar {смещение MyVar}
DW MyProc {смещение MyProc}
DD 0FFFFFFFH {1 двойное слово}
DD 0,99999999 { 2 двойных слова}
DD 'A' {эквивалентноDB'A',0,0,0}
DD 'DBCA' {эквивалентно DS 'A','B','C','D'}
DD MyVar {указатель на MyVar}
DD MyProc {указатель на MyProc}
END;
В Турбо Ассемблере, когда перед идентификатором указывается DB, DW или DD, это приводит к генерации в том месте, где указана директива, переменной размером в байт, слово или двойное слово. Например, Турбо Ассемблер допускает следующее:
ByteVar DB ?
WordVar DW ?
...
mov al, ByteVar
mov bx, WordVar
Встроенный ассемблер не поддерживает такие описания переменных. В Borland Pascal единственным видом идентификатора, который можно определить в операторе встроенного ассемблера, является метка. Все переменные должны описываться с помощью синтаксиса Паскаля, и предыдущая конструкция соответствует следующему:
var
ByteVar: Byte;
WordWat: Word;
.
.
.
asm
mov al,ByteVar
mov bx,WordVar
end;
Операнды
Операнды встроенного ассемблера представляют собой выражения, которые состоят из сочетания констант, регистров, идентификаторов и операций. Хотя выражения встроенного ассемблера формируются с использованием тех же основных принципов, что и выражения Паскаля, имеется ряд важных отличий, которые необходимо пояснить.
Во встроенном ассемблере предопределенный смысл имеют следующие зарезервированные слова:
AH CL FAR SEG
AL CS HIGH SHL
AND CX LOW SHR
AX DH MOD SI
BH DI NEAR SP
BL DL NOT SS
BP DS OFFSET ST
BX DWORD OR TBYTE
BYTE DX PTR TYPE
CH ES WQORD WORD
XOR
Зарезервированные слова всегда имеют больший приоритет, чем определенные пользователем идентификаторы. Например, во фрагменте программы:
var
ch: Char;
...
asm
mov ch,1
end;
1 будет загружаться в регистр CH, а не в переменную CH. Для доступа к определенному пользователем имени нужно использовать амперсанд - операцию переопределения идентификатора (&).
asm
mov &ch,1
end;
Мы настоятельно рекомендуем не использовать определенные пользователем идентификаторы с теми же именами, что и зарезервированные слова встроенного ассемблера, поскольку такая путаница имен может легко приводить к очень трудноуловимым ошибкам.
Достарыңызбен бөлісу: |