Доступ к первому байту ПОСЛЕ записи Delphi, класс et c. от сборки рутины - PullRequest
5 голосов
/ 22 января 2020

Хорошо известно для ассемблерных кодеров в 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;

Может быть, есть идеи получше?

1 Ответ

9 голосов
/ 22 января 2020

Вы можете использовать TYPE(typename), чтобы найти размер типа в выражении asm. Например:

mov al, [rcx + TYPE(THeader)]

Это (вместе с рядом других полезных операторов) задокументировано: http://docwiki.embarcadero.com/RADStudio/en/Assembly_Expressions#Expression_Operators

...