В следующей таблице приведен обзор того, как результаты возвращаются из функции в программу. Для более подробной информации насчет каждого типа, читайте соответствующий раздел.
Тип Дельфи |
Результат |
Размер |
ShortInt |
al |
8-битное значение |
SmallInt |
ax |
16-битное значение |
LongInt |
EAX |
32-битное значение |
Byte |
al |
Значение типа байт |
Word |
ax |
Значение типа слово |
Dword |
EAX |
Значение типа двойное слово |
Int64 |
EDX:EAX |
64-битное значение |
Boolean |
al |
Значение типа байт |
ByteBool |
al |
Значение типа байт |
WordBool |
ax |
Значение типа слово |
LongBool |
EAX |
Значение типа двойное слово |
Char |
al |
Значение типа байт |
AnsiChar |
al |
Значение типа байт |
WideChar |
ax |
Значение типа слово |
ShortString |
Указатель в Result (1) |
32-битный указатель |
AnsiString |
Указатель в Result (1) |
32-битный указатель |
WideString |
Указатель в Result (1) |
32-битный указатель |
Variant |
Указатель в Result (1) |
32-битный указатель |
Pointers |
EAX |
32-битный указатель |
Objects |
EAX |
32-битный указатель |
Class and Class reference |
EAX |
32-битный указатель |
Procedure pointer |
EAX |
32-битный указатель |
Method pointers |
Указатель в Result (2) |
2 x 32-битных указателя |
Sets |
EAX или Result (3) |
Непосредственно или как 32-битный указатель (3) |
Records |
EAX или Result (3) |
Непосредственно или как 32-битный указатель (3) |
Static Arrays |
EAX или Result (3) |
Непосредственно или как 32-битный указатель (3) |
Dynamic arrays |
Указатель в Result (1) |
32-битный указатель |
Single |
ST(0) |
n/a |
Double |
ST(0) |
n/a |
Extended |
ST(0) |
n/a |
Real48 |
ST(0) |
n/a |
Currency |
ST(0) (4) |
n/a |
(1) Переменная Result в действительности передается в функцию, как дополнительный var параметр. Эта переменная Result содержит 32-битный указатель на область результата в памяти. Подлинное местонахождение зависит от типа использованного соглашения о вызове: Для соглашения register это может быть EAX, EDX или ECX, в зависимости от количества переданных параметров. В других случаях Result это 32-битный указатель на стеке.
(2) Переменная Result указывает на адрес памяти где расположены два 32-битных указателя. Этот указатель передается так, как если бы он был действительно объявлен, и его точное местонахождение зависит от типа используемого соглашения о вызове.
(3) Если подлинный тип помещается в 32 бита, то он возвращается напрямую через регистр al/ax/EAX. Иначе, Result содержит 32-битный указатель на переменную памяти, и он передается в функцию, как если бы он был объявлен как дополнительный 32-битный var параметр. Этот параметр (точное местонахождение зависит от типа использованного соглашения о вызове) должен содержать указатель на действительные данные в памяти
(4) Значение в ST(0) является маштабированным значением (x10000). Для примера, значение 5,8745 возвращается как 58745.