Указатель встроенного ассемблера Delphi на структуру - PullRequest
5 голосов
/ 01 октября 2011

Привет, люди, есть способ, которым я могу получить доступ к указателю на член структуры непосредственно из встроенного ассемблера, я попробовал это

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 ]

12 голосов
/ 01 октября 2011

Еще один обходной путь:

procedure test(eu:PImageDosHeader);
asm
    push eu.TImageDosHeader._lfanew
end;
4 голосов
/ 01 октября 2011

работают следующие работы:

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 голосов
/ 01 октября 2011

Я бы написал так:

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

Соответствующая документация здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...