Delphi内联汇编程序指向结构的指针
大家好,有没有一种方法可以直接从内嵌汇编程序访问指向结构成员的指针?我试过这个Delphi内联汇编程序指向结构的指针,delphi,assembly,Delphi,Assembly,大家好,有没有一种方法可以直接从内嵌汇编程序访问指向结构成员的指针?我试过这个 procedure test(eu:PImageDosHeader);assembler; asm push eu._lfanew end; 它不会编译,但如果我用这个 procedure test(eu:Pointer); var xx:TImageDosHeader; begin xx:=TImageDosHeader(eu^); asm push xx._lfan
procedure test(eu:PImageDosHeader);assembler;
asm
push eu._lfanew
end;
它不会编译,但如果我用这个
procedure test(eu:Pointer);
var
xx:TImageDosHeader;
begin
xx:=TImageDosHeader(eu^);
asm
push xx._lfanew
end;
end;
它工作得很好。你知道如何通过内联asm中的指针访问结构吗?是优化代码的问题以下工作:
type
PMyStruct = ^TMyStruct;
TMyStruct = record
A, B: cardinal;
end;
procedure ShowCard(Card: cardinal);
begin
ShowMessage(IntToHex(Card, 8));
end;
procedure test(Struct: PMyStruct);
asm
push ebx // We must not alter ebx
mov ebx, eax // eax is Struct; save in ebx
mov eax, TMyStruct(ebx).A
call ShowCard
mov eax, TMyStruct(ebx).B
call ShowCard
pop ebx // Restore ebx
end;
procedure TForm6.FormCreate(Sender: TObject);
var
MyStruct: TMyStruct;
begin
MyStruct.A := $22222222;
MyStruct.B := $44444444;
test(@MyStruct);
end;
我会这样写:
procedure test(const eu: TImageDosHeader);
asm
push TImageDosHeader([EAX])._lfanew
end;
相关文档是。另一个解决方法:
procedure test(eu:PImageDosHeader);
asm
push eu.TImageDosHeader._lfanew
end;
这正是我需要的,大卫的方法很好,但这一个很好。谢谢你,伙计@操作码:我认为@David的方法也可以与您的签名一起使用,因此Serg的方法与David(和我的)的方法之间的唯一区别纯粹是美学上的。例如,在我的代码中,可以用
mov-eax,ebx.tmystuct.A
替换mov-eax,tmystuct.A
和mov-eax,tmystuct(ebx).B
替换mov-eax,ebx.tmystuct.B
@andreasrejb,区别在于我不需要浪费存储地址的寄存器。我不是特别谈论这段代码,因为我知道参数是通过寄存器传递的,但在某些情况下寄存器可以计数。是的,这个链接对主题是至关重要的。symbols
部分的最后一段包含了STRUC
的四个语法选项。我经常遇到这个问题。这里有很多人因为不喜欢你的昵称而投了反对票,但他们没有投反对票,但是…:A:你不需要保存EAX、EDX和ECX,所以你可以将test
更改为:`asm mov ECX,EAX mov EAX,TMystuct(ecx).A呼叫显示卡mov eax,TMystuct(ecx).B呼叫显示卡