Delphi内联汇编程序指向结构的指针

时间:2011-10-01 15:43:23

标签: 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._lfanew
 end;
 end;

它工作得很好。任何想法如何通过内联asm中的指针访问结构?是优化代码的问题

3 个答案:

答案 0 :(得分:12)

另一种解决方法:

procedure test(eu:PImageDosHeader);
asm
    push eu.TImageDosHeader._lfanew
end;

答案 1 :(得分:4)

以下作品:

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;

答案 2 :(得分:2)

我会这样写:

procedure test(const eu: TImageDosHeader);
asm
    push TImageDosHeader([EAX])._lfanew
end;

相关文档为here