Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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;


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru