Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
В отличие от программ на классическом ассемблере точка с запятой не
является признаком начала комментария во встроенном ассемблере.
Встроенный ассемблер языков высокого уровня: принципы использования ментарии внутри ассемблерного блока подчиняются правилам, принятым
в Delphi.
6.2. Директивы встроенного ассемблера
Встроенный ассемблер поддерживает три директивы: DB (Define Byte — определить
байт), DW (Define Word — определить слово) и DD (Define Double
Word — определить двойное слово). Каждая из этих директив генерирует
данные следующих типов.
1. Директива DB определяет один или последовательность нескольких байт.
Операнд должен быть либо числовым значением в диапазоне —128 и 255,
либо представлять собой строку символов произвольной длины. Числовое
значение генерирует один байт кода, в то время как строка представляет
собой последовательность ASCII символов.
2. Директива DW определяет последовательность слов. Каждый операнд должен
быть либо числовым значением, лежащим в диапазоне —32 768 и
65 535, либо адресным выражением.
3. Директива DD определяет последовательность двойных слов. Каждый
операнд может быть либо числовым значением, лежащим между —
2 147 483 648 и 4 294 967 295, либо адресным выражением.
Далее приведены примеры использования директив DB, DW И DD:
asm
DB
DB
DB
DB
DB
FFH
0, 99
'A'
Привет, мир !', ODH, OAH
12, "string"
// один байт
// два байта
// символ 'А'
// строка символов
// Delphi-строка
DW
DW
DW
DW
0FFFFH
0, 9999
'А'
•ВА'
// одно слово
// два слова
// то же, что и DB 'А', 0
// то же, что и DB 'А', 'В*
DD
DD
DD
DD
end;
OFFFFFFFFH
0, 999999999
'А'
•DCBA*
// одно двойное слово
// два двойных слова
// то же, что и DB 'А', 0, 0, 0
// то же, что и DB 'А*, 'В', 'С*, 'D'
Некоторые директивы, такие как EQU, PROC, STRUC, SEGMENT и MACRO, встроенным
ассемблером не поддерживаются, хотя для них существуют эквивалентные
конструкции в Object Pascal. Например, директиве EQU соответствует
константа в языке Pascal, директиве PROC —объявление процедуры или
функции, директиве STRUC — записи (record).
Все переменные должны быть определены в соответствии с синтаксисом
Delphi. Переменные размером в 1 байт, слово или двойное слово соответствуют
идентификаторам BYTE, WORD И integer. Это продемонстрировано в
следующем фрагменте программного кода:
var
varByte: BYTE;
varWord: WORD;
varlnt: Integer;
asm
mov AL, varByte
mov BX, varWord
mov ECX, varlnt
end;
6.3. Выражения во встроенном ассемблере
Любое выражение встроенного ассемблера характеризуется типом или, более
точно, размером. Например, переменная типа integer имеет размер
4 байта. Встроенный ассемблер всегда выполняет проверку типов переменных.
Так при выполнении следующего фрагмента кода:
var
Flag: Boolean;
BufW: WORD;
BufDw: DWORD;
asm
mov AL, Flag v.
mov BX, BufW
mov CX, Buf Dw
end;
Встроенный ассемблер языков высокого уровня: принципы использования
компилятор выдаст ошибку при анализе команды:
mov СХ, BufDw
из-за несовпадения размеров операндов. Возможным выходом в этой ситуации
является либо использование 32-разрядного регистра, например ЕСХ,
либо явное указание типа второго операнда. Возможные варианты.показаны
в следующем примере:
var
Flag: Boolean;
BufW: WORD;
BufDw: DWORD;
asm
mov
mov
mov
end
CX, word ptr BufDw
CX, Word(BufDw)
CX, BufDw.Word
При анализе этих трех команд необходимо учитывать то, что в качестве второго
операнда используется младшее слово переменной BufDw.
В некоторых случаях, когда в командах используются регистры и ячейки
памяти, ассемблер определяет размер переменной в памяти автоматически,
в соответствии с типом регистра:
procedure TestSize(var Buf);
begin
asm
mov AL, [Buf]
mov CX, [Buf]
mov EDX, [Buf]
end;
end;
Первая команда помещает 1 байт данных в регистр AL из области памяти,
определяемой указателем Buf, вторая помещает слово в регистр сх и, наконец, третья сохраняет в регистре EDX д в о й н о е слово из той же области
памяти.
В тех случаях, когда ассемблер не может определить тип данных, необходимо
явным образом определить размер операнда, как, например, в этих командах:
inc word ptr [ЕСХ]
mui word ptr [EDX]
Все выражения встроенного ассемблера приводятся к 32-разрядному целочисленному
типу. Не поддерживаются выражения, включающие вещественные
значения и строковые переменные, за исключением строковых констант.
Следует отметить отличия между выражениями Object Pascal и встроенного
ассемблера, касающиеся способов обработки констант и переменных. Если
выполнить следующий фрагмент кода:
const
X = 15;
Y = 25;
var
Z: Integer;
Встроенный ассемблер языков высокого уровня: принципы использования 427
begin
Z : = X + Y;
то ассемблерная команда
asm
mov Z, X+Y
end;
отработает корректно. В то же время, если х и Y — переменные, то эта же
команда даст неправильный результат. Дело в том, что встроенный ассемблер
не сможет вычислить значение выражения х + Y во время компиляции.
Чтобы правильно вычислить сумму, следует использовать следующую последовательность
команд:
asm
mov ЕАХ, X
add ЕАХ, Y
mov Z, ЕАХ
end;
<< Назад В начало Далее >> |
|