2015-06-11 21 views
7

Czy to błąd kompilatora?Dlaczego nie mogę użyć elementów wewnętrznych kompilatora w bloku 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. 

Ten program wyświetla wszystkie rzeczy oprócz 4/8.

Czy jest to błąd, czy jest to udokumentowane, że nie mogę używać SizeOf i innych właściwości kompilatora w asemblerze?
Jeśli chciałbym użyć SizeOf(xx) w bloku ASM co mam zrobić?

+0

Domyślam się, że twój kod jest tylko ilustracyjnym przykładem, więc weź to jako sidenote; w tym przypadku możesz zadeklarować stałą. – TLama

Odpowiedz

7

Nie można używać elementów kompilatora, ponieważ są one przetwarzane przez kompilator Delphi, a nie przez asembler. Procesy wewnętrzne są rozwiązywane przez kompilator i przetwarzanie kompresji Pascala, a następnie wysyłanie kodu. To zadanie kompilatora, a nie asemblera. Przynajmniej to mój model mentalny.

W przypadku SizeOf trzeba użyć operatora ekspresji type montaż:

add eax, type NativeInt 

lub wręcz:

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

Funkcja ta działa zgodnie z oczekiwaniami.

Dokumentacja tutaj: .

I tak, fakt, że twój kod kompiluje, powinien być uważany za błąd.

Powiązane problemy