some expressions not supported in asm
Original Reporter info from Mantis: Thorsten Engler
-
Reporter name: Thorsten Engler
Original Reporter info from Mantis: Thorsten Engler
- Reporter name: Thorsten Engler
Description:
{$APPTYPE CONSOLE}
{$ifdef fpc}
{$mode delphi}
{$endif}
program AsmTest;
type
TMyObject = class(TObject)
Field1 : Integer;
Field2 : Integer;
procedure VirtualMethod1; virtual;
procedure VirtualMethod2; virtual;
end;
TMyRecord = record
EAX : Integer;
EBX : Integer;
ECX : Integer;
EDX : Integer;
end;
{ TMyObject }
procedure TMyObject.VirtualMethod1;
begin
end;
procedure TMyObject.VirtualMethod2;
begin
end;
// comments are the values in 2.3.1/x86 in Dec 2008
function VirtualMethodVMTOFFSET1: Integer;
asm
mov eax, VMTOFFSET TMyObject.VirtualMethod1; // $80
end;
function VirtualMethodVMTOFFSET2: Integer;
asm
mov eax, VMTOFFSET TMyObject.VirtualMethod2; // $84
end;
function IUnknownAddRefVMTOFFSET1: Integer;
asm
mov eax, VMTOFFSET IUnknown._AddRef; //$4
end;
function Field1: Integer;
asm
mov eax, TMyObject.Field1; // $4
end;
function Field1OFFSET: Integer;
asm
mov eax, OFFSET TMyObject.Field1; // $4
end;
var
_Test: Integer;
function Test: Integer;
asm
mov eax, _Test; // movl U_P$ASMTEST__TEST,%eax
end;
function TestOFFSET: Integer;
asm
mov eax, OFFSET _Test; // $U_P$ASMTEST__TEST
end;
function LabelOFFSET: Integer;
asm
mov eax, OFFSET @@Exit // label that indeed points to the ret (no stackframe)
ret
@@Exit:
end;
function TMyObjectTYPE: Integer;
asm
mov eax, TYPE TMyObject // $4 (?)
end;
function TMyRecordTYPE: Integer;
asm
mov eax, TYPE TMyRecord // $16 (?)
end;
function FillMyRecord: TMyRecord;
asm
mov [eax + TMyRecord.&eax], eax // (%eax)
mov [eax + TMyRecord.&ebx], ebx // 4(%eax)
mov [eax + TMyRecord.&ecx], ecx // 8(%eax)
mov [eax + TMyRecord.&edx], edx // 12(%eax)
end;
var
MyRecord : TMyRecord;
function Expression1: Integer;
asm
mov eax, 4 * 3 - 2 + (-1) / 2 // does not compile
end;
function Expression2: Integer;
asm
mov eax, NOT 4 OR 3 AND 2 XOR 1 MOD 6 SHL 4 SHR 2 // does not compile
end;
begin
_Test := 123;
WriteLn('VirtualMethodVMTOFFSET1: ', VirtualMethodVMTOFFSET1);
WriteLn('VirtualMethodVMTOFFSET2: ', VirtualMethodVMTOFFSET2);
WriteLn('IUnknownAddRefVMTOFFSET1: ', IUnknownAddRefVMTOFFSET1);
WriteLn('Field1: ', Field1);
WriteLn('Field1OFFSET: ', Field1OFFSET);
WriteLn('Test: ', Test);
WriteLn('TestOFFSET: ', TestOFFSET);
WriteLn('LabelOFFSET: ', LabelOFFSET);
WriteLn('TMyObjectTYPE: ', TMyObjectTYPE);
WriteLn('TMyRecordTYPE: ', TMyRecordTYPE);
MyRecord.eax := 0;
MyRecord.ebx := 0;
MyRecord.ecx := 0;
MyRecord.edx := 0;
MyRecord := FillMyRecord;
WriteLn('MyRecord.eax: ', MyRecord.eax);
WriteLn('MyRecord.ebx: ', MyRecord.ebx);
WriteLn('MyRecord.ecx: ', MyRecord.ecx);
WriteLn('MyRecord.edx: ', MyRecord.edx);
WriteLn('Expression1: ', Expression1);
WriteLn('Expression2: ', Expression2);
end.
Delphi produces:
Delphi produces: (FPC in comments if differnet)
VirtualMethodVMTOFFSET1: 0 // 80
VirtualMethodVMTOFFSET2: 4 // 84
IUnknownAddRefVMTOFFSET1: 4
Field1: 4
Field1OFFSET: 4
Test: 123
TestOFFSET: 4229096 // different, but I'm on FreeBSD
LabelOFFSET: 4210474 // different, but I'm on FreeBSD
TMyObjectTYPE: 4
TMyRecordTYPE: 16
MyRecord.eax: 1310624 // these eax..edx values are random?
MyRecord.ebx: 2147344384
MyRecord.ecx: 2011624637
MyRecord.edx: 2573
Expression1: 10 // doesn't compile in FPC
Expression2: -1 // doesn't compile in FPC
Mantis conversion info:
- Mantis ID: 8195
- Version: 2.2.0