Хорошо известно для ассемблерных кодеров в Delphi, что любые поля записи, класса et c. можно получить доступ из подпрограммы кода asm
, как показано в примере ниже:
type
THeader = packed record
field1: uint64;
field2: uint32;
end;
(* some code here *)
asm
mov rax, [rcx + THeader.field1]
mov edx, [rcx + THeader.field2]
end;
Но что, если - как следует из названия - это просто заголовок большого потока данных непредсказуемого размера, и я хотите получить доступ к фактической начальной позиции потока данных (т. е. первый байт после заголовка)? Простое решение может быть показано ниже (но я предпочитаю что-то менее неестественное, без определения константы):
type
THeader = packed record
field1: uint64;
field2: uint32;
end;
(* start_of_data_stream: byte; *)
const
SIZEOFTHEADER = sizeof(THeader);
(* some code here *)
asm
mov al, [rcx + SIZEOFTHEADER] (* [rcx + THeader.start_of_data_stream] *)
end;
Может быть, есть идеи получше?