从汇编例程访问 Delphi 记录后的第一个字节,class 等
Accessing the first byte AFTER a Delphi record, class etc. from assembly routine
众所周知,Delphi 中的汇编编码器可以从 asm
代码例程访问记录的任何字段,class 等,如下例所示:
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 大小不可预测的大数据流,我想访问数据流的实际开始位置(即第一个byte after header)?
一个简单的解决方案可能如下所示(但我更喜欢不那么不自然的东西,没有定义常量):
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 中的汇编编码器可以从 asm
代码例程访问记录的任何字段,class 等,如下例所示:
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 大小不可预测的大数据流,我想访问数据流的实际开始位置(即第一个byte after header)? 一个简单的解决方案可能如下所示(但我更喜欢不那么不自然的东西,没有定义常量):
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