Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi内联汇编程序指向结构的指针_Delphi_Assembly - Fatal编程技术网

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呼叫显示卡