2011-10-01 11 views
5

Hi ludzi czy istnieje sposób mogę uzyskać dostęp do wskaźnika do elementu struktury bezpośrednio w linii asemblerze Próbowałem toDelphi inline assemblera wskaźnik do struktury

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

To nie będzie kompilować, ale jeśli mogę użyć tego

procedure test(eu:Pointer); 
var 
xx:TImageDosHeader; 
begin  
xx:=TImageDosHeader(eu^); 
asm 
    push xx._lfanew 
end; 
end; 

Działa świetnie. Każdy pomysł, w jaki sposób uzyskać dostęp do struktury za pomocą wskaźnika w inline ASM? Jest to kwestia optymalizacji kodu

+0

http://www.delphi3000.com/articles/article_3769.asp –

Odpowiedz

12

Kolejny obejście:

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

+1 schludny, nie widziałem tej składni w dokumentach. –

+0

To jest dokładnie to, czego potrzebowałem podejście Davida jest dobre, ale to jest świetne. Dzięki kolego! – opc0de

+0

@opcode: Myślę, że podejście @ Davida może być używane również z twoim podpisem, więc jedyna różnica między podejściem Serga a Davidem (i moim) jest czysto estetyczna. Na przykład w moim kodzie mógłbyś zastąpić 'mov eax, TMyStruct (ebx) .A' przez' mov eax, ebx.TMyStruct.A' i 'mov eax, TMyStruct (ebx) .B' przez' mov eax, ebx .TMyStruct.B'. –

4

następujące prace:

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; 
+3

mogę zapytać, dlaczego ta została downvoted? –

+0

Często pojawia się ten problem, jest tu wielu ludzi, którzy twierdzą, że nie lubią twojego pseudonimu – opc0de

+0

Nie odrzucili, ale ...: A: nie musisz zapisywać EAX, EDX i ECX, więc ty może zmienić 'test' na:' asm mov ecx, eax mov eax, TMyStruct (ecx) .A wywołanie ShowCard mov eax, TMyStruct (ecx) .B call ShowCard – Johan

2

chciałbym napisać to tak:

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

Stosowny dokumentacja jest here.

+0

Tak, to łącze jest niezbędne dla tematu. Ostatni akapit sekcji 'symbols' zawiera cztery opcje syntaktyczne dla' STRUC's –

Powiązane problemy