从汇编例程访问 Delphi 记录、类等之后的第一个字节

Zol*_*író 5 delphi assembly record

Delphi 中的汇编编码人员众所周知,可以从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;
Run Code Online (Sandbox Code Playgroud)

但是如果——顾名思义——这只是一个大的、不可预测大小的数据流的头,我想访问数据流的实际开始位置(即头的第一个字节)怎么办?一个简单的解决方案可能如下所示(但我更喜欢不那么不自然的东西,不定义常量):

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;
Run Code Online (Sandbox Code Playgroud)

也许有更好的想法?

Dav*_*nan 9

您可以使用TYPE(typename)在 asm 表达式中查找类型的大小。例如:

mov al, [rcx + TYPE(THeader)]
Run Code Online (Sandbox Code Playgroud)

这(连同许多其他有用的运算符)被记录在案:http : //docwiki.embarcadero.com/RADStudio/en/Assembly_Expressions#Expression_Operators