2011-10-01 7 views
5

Hola gente ¿hay alguna manera puedo acceder a un puntero a un miembro de la estructura directamente de ensamblador en línea Probé esteDelphi puntero del ensamblador en línea para estructurar

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

No se compilará pero si puedo utilizar esta

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

Funciona genial. ¿Alguna idea de cómo puedo acceder a una estructura a través de un puntero en el asm en línea? Es una cuestión de optimizar el código

+0

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

Respuesta

12

Sin embargo, otra solución:

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

+1 limpio, no vi esa sintaxis en los documentos –

+0

Esto es exactamente lo que necesitaba El enfoque de David es bueno, pero este es genial. ¡Gracias, amigo! – opc0de

+0

@opcode: Creo que el enfoque de @David también se puede usar con su firma, por lo que la única diferencia entre el enfoque de Serg y el de David (y el mío) es puramente estético. Por ejemplo, en mi código, podría reemplazar 'mov eax, TMyStruct (ebx) .A' por' mov eax, ebx.TMyStruct.A' y 'mov eax, TMyStruct (ebx) .B' por' mov eax, ebx .TMyStruct.B'. –

4

las siguientes obras:

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

¿Puedo preguntar por qué esto se downvoted? –

+0

A menudo me da este problema, hay muchas personas aquí que votan a duras penas porque no les gusta su apodo – opc0de

+0

No votó a favor, pero ...: A: no necesita guardar EAX, EDX y ECX, por lo que puede cambiar 'test' a:' asm mov ecx, eax mov eax, TMyStruct (ecx) .Una llamada ShowCard mov eax, TMyStruct (ecx) .B llamada ShowCard – Johan

2

lo escribiría así:

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

La documentación pertinente es here.

+0

Sí, este enlace es vital para el sujeto. El último párrafo de la sección 'symbols' contiene cuatro opciones sintácticas para' STRUC's –

Cuestiones relacionadas