2015-06-11 6 views
7

Si tratta di un bug del compilatore?Perché non riesco a utilizzare le intrinseche del compilatore in un blocco asm?

program Project44; 
{$APPTYPE CONSOLE} 
uses 
    System.SysUtils; 

function Test: integer; 
asm 
    xor eax,eax 
    add eax,SizeOf(NativeInt); 
end; 

begin 
    WriteLn(Test); //Typically outputs 31 or 49 
    {$ifdef CPUX86} 
    WriteLn('should be 4'); 
    {$else} 
    {$ifdef CPUX64} 
    WriteLn('should be 8'); 
    {$endif}{$endif} 
    ReadLn 
end. 

Questo programma genera tutti i tipi di cose, ad eccezione di 4/8.

Si tratta di un bug o è documentato che non posso utilizzare SizeOf e altri componenti intrinsechi del compilatore nell'assembler?
Se vorrei usare SizeOf(xx) in un blocco asm cosa devo fare?

+0

Immagino che il tuo codice sia solo un esempio illustrativo, quindi prendi questo come sidenote; in questo caso potresti dichiarare una costante. – TLama

risposta

7

Non è possibile utilizzare i dati intrinseci del compilatore perché vengono elaborati dal compilatore Delphi anziché dall'assemblatore. I problemi intrinseci vengono risolti dal compilatore Pascal che elabora e analizza le espressioni Pascal e quindi emette il codice. Questo è il lavoro di un compilatore piuttosto che di un assemblatore. Almeno, questo è il mio modello mentale.

Nel caso di SizeOf è necessario utilizzare il type assemblaggio espressione operator:

add eax, type NativeInt 

O addirittura:

function Test: integer; 
asm 
    mov eax, type NativeInt 
end; 

Questa funzione esegue come previsto.

Documentazione: Assembly Expressions, Expression Operators.

E sì, il fatto che il codice venga compilato dovrebbe essere considerato un bug.

Problemi correlati