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

标签 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;

但是,如果 - 顾名思义 - 这只是一个大的、大小不可预测的数据流的 header ,并且我想访问数据流的实际起始位置(即,之后的第一个字节),该怎么办?/em> 标题)? 一个简单的解决方案可能如下所示(但我更喜欢不那么不自然的解决方案,无需定义常量):

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;

也许有更好的想法?

最佳答案

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

mov al, [rcx + TYPE(THeader)]

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

关于delphi - 从汇编例程访问 Delphi 记录、类等之后的第一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59859674/

相关文章:

将汇编内联从 32 位转换为 64 位

c# - 将记录类型与 C# 中的 LINQ 进行比较

windows - 如何限制应用程序可以分配的内存

delphi - 如何显示未命名驱动器的标签?

windows - 我应该在 Firemonkey 中使用 TMainMenu 来同时支持 Windows 和 OS-X 吗?

assembly - 获取 x86 汇编语言中变量的位置

arrays - 如何查看已初始化数组与未初始化数组占用的内存

typescript - 知道 key 的 Typescript Record 访问的复杂性是什么?

delphi - 无法定义记录指针

delphi - 如何让TWebBrowser像Internet Explorer一样使用ctrl+鼠标滚轮缩放?