2011-10-01 14 views
5

Ciao gente c'è un modo che io possa accedere a un puntatore a un membro della struttura direttamente da in linea assembler ho provato questoDelphi puntatore assemblatore inline di strutturare

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

Non verrà compilato, ma se io uso questo

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

Funziona alla grande. Qual è l'idea di come accedere a una struttura tramite un puntatore in linea asm? è una questione di ottimizzazione del codice

+0

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

risposta

12

Ancora un'altra soluzione:

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

+1 pulito, non ho visto quella sintassi nei documenti –

+0

Questo è esattamente ciò di cui avevo bisogno L'approccio di David è buono ma questo è ottimo. Grazie amico! – opc0de

+0

@opcode: Penso che l'approccio di @ David possa essere usato anche con la tua firma, quindi l'unica differenza tra l'approccio di Serg e quello di David (e il mio) è puramente estetico. Ad esempio, nel mio codice, è possibile sostituire 'mov eax, TMyStruct (ebx) .A' da' mov eax, ebx.TMyStruct.A' e 'mov eax, TMyStruct (ebx) .B' da mov eax, ebx .TMyStruct.B'. –

4

le seguenti opere:

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

Posso chiedere il motivo per cui questo è stato downvoted? –

+0

Spesso capisco che ci sono molte persone qui che scelgono downvote solo perché non amano il tuo nickname – opc0de

+0

Non sono state inoltrate, ma ...: A: non è necessario salvare EAX, EDX ed ECX, quindi tu può cambiare 'test' in:' asm mov ecx, eax mov eax, TMyStruct (ecx) .Una chiamata ShowCard mov eax, TMyStruct (ecx) .B chiama ShowCard – Johan

2

vorrei scrivere in questo modo:

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

La documentazione pertinente è here.

+0

Sì, questo link è vitale per il soggetto. L'ultimo paragrafo della sezione 'symbols' contiene quattro opzioni sintattiche per' STRUC' –