mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 17:28:14 +02:00
183 lines
5.8 KiB
ObjectPascal
183 lines
5.8 KiB
ObjectPascal
{ %CPU=i386 }
|
|
|
|
{$IFDEF FPC}
|
|
{$MODE DELPHI}
|
|
{$PIC OFF}
|
|
{$ELSE}
|
|
{$APPTYPE CONSOLE}
|
|
{$ENDIF}
|
|
program tasm27a;
|
|
|
|
{$S-}
|
|
|
|
type
|
|
{$IFNDEF FPC}
|
|
CodePointer = Pointer;
|
|
{$ENDIF}
|
|
TRec = record
|
|
Str: String[8];
|
|
Arr: array [-5..10] of SmallInt;
|
|
end;
|
|
|
|
var
|
|
Rec: TRec;
|
|
|
|
const
|
|
x_size = 6*8*4+1;
|
|
procedure x; assembler;
|
|
asm
|
|
dd Rec.Str { dd Rec.Str }
|
|
dd Rec.Str[0] { dd Rec.Str }
|
|
dd Rec.Arr { dd Rec.Arr }
|
|
dd Rec.Arr[2] { dd Rec.Arr+2 }
|
|
dd 5[7] { dd 12 }
|
|
dd 5+[7] { dd 12 }
|
|
dd 5-[7] { dd -2 }
|
|
dd [5] { dd 5 }
|
|
|
|
dd byte ptr Rec.Str { dd Rec.Str }
|
|
dd byte ptr Rec.Str[0] { dd Rec.Str }
|
|
dd byte ptr Rec.Arr { dd Rec.Arr }
|
|
dd byte ptr Rec.Arr[2] { dd Rec.Arr+2 }
|
|
dd byte ptr 5[7] { dd 12 }
|
|
dd byte ptr 5+[7] { dd 12 }
|
|
dd byte ptr 5-[7] { dd -2 }
|
|
dd byte ptr [5] { dd 5 }
|
|
|
|
dd word ptr Rec.Str { dd Rec.Str }
|
|
dd word ptr Rec.Str[0] { dd Rec.Str }
|
|
dd word ptr Rec.Arr { dd Rec.Arr }
|
|
dd word ptr Rec.Arr[2] { dd Rec.Arr+2 }
|
|
dd word ptr 5[7] { dd 12 }
|
|
dd word ptr 5+[7] { dd 12 }
|
|
dd word ptr 5-[7] { dd -2 }
|
|
dd word ptr [5] { dd 5 }
|
|
|
|
dd dword ptr Rec.Str { dd Rec.Str }
|
|
dd dword ptr Rec.Str[0] { dd Rec.Str }
|
|
dd dword ptr Rec.Arr { dd Rec.Arr }
|
|
dd dword ptr Rec.Arr[2] { dd Rec.Arr+2 }
|
|
dd dword ptr 5[7] { dd 12 }
|
|
dd dword ptr 5+[7] { dd 12 }
|
|
dd dword ptr 5-[7] { dd -2 }
|
|
dd dword ptr [5] { dd 5 }
|
|
|
|
dd qword ptr Rec.Str { dd Rec.Str }
|
|
dd qword ptr Rec.Str[0] { dd Rec.Str }
|
|
dd qword ptr Rec.Arr { dd Rec.Arr }
|
|
dd qword ptr Rec.Arr[2] { dd Rec.Arr+2 }
|
|
dd qword ptr 5[7] { dd 12 }
|
|
dd qword ptr 5+[7] { dd 12 }
|
|
dd qword ptr 5-[7] { dd -2 }
|
|
dd qword ptr [5] { dd 5 }
|
|
|
|
dd tbyte ptr Rec.Str { dd Rec.Str }
|
|
dd tbyte ptr Rec.Str[0] { dd Rec.Str }
|
|
dd tbyte ptr Rec.Arr { dd Rec.Arr }
|
|
dd tbyte ptr Rec.Arr[2] { dd Rec.Arr+2 }
|
|
dd tbyte ptr 5[7] { dd 12 }
|
|
dd tbyte ptr 5+[7] { dd 12 }
|
|
dd tbyte ptr 5-[7] { dd -2 }
|
|
dd tbyte ptr [5] { dd 5 }
|
|
end;
|
|
procedure x_verify; assembler;
|
|
asm
|
|
dd Rec.Str { dd Rec.Str }
|
|
dd Rec.Str { dd Rec.Str[0] }
|
|
dd Rec.Arr { dd Rec.Arr }
|
|
dd Rec.Arr+2 { dd Rec.Arr[2] }
|
|
dd 12 { dd 5[7] }
|
|
dd 12 { dd 5+[7] }
|
|
dd -2 { dd 5-[7] }
|
|
dd 5 { dd [5] }
|
|
|
|
dd Rec.Str { dd byte ptr Rec.Str }
|
|
dd Rec.Str { dd byte ptr Rec.Str[0] }
|
|
dd Rec.Arr { dd byte ptr Rec.Arr }
|
|
dd Rec.Arr+2 { dd byte ptr Rec.Arr[2] }
|
|
dd 12 { dd byte ptr 5[7] }
|
|
dd 12 { dd byte ptr 5+[7] }
|
|
dd -2 { dd byte ptr 5-[7] }
|
|
dd 5 { dd byte ptr [5] }
|
|
|
|
dd Rec.Str { dd word ptr Rec.Str }
|
|
dd Rec.Str { dd word ptr Rec.Str[0] }
|
|
dd Rec.Arr { dd word ptr Rec.Arr }
|
|
dd Rec.Arr+2 { dd word ptr Rec.Arr[2] }
|
|
dd 12 { dd word ptr 5[7] }
|
|
dd 12 { dd word ptr 5+[7] }
|
|
dd -2 { dd word ptr 5-[7] }
|
|
dd 5 { dd word ptr [5] }
|
|
|
|
dd Rec.Str { dd dword ptr Rec.Str }
|
|
dd Rec.Str { dd dword ptr Rec.Str[0] }
|
|
dd Rec.Arr { dd dword ptr Rec.Arr }
|
|
dd Rec.Arr+2 { dd dword ptr Rec.Arr[2] }
|
|
dd 12 { dd dword ptr 5[7] }
|
|
dd 12 { dd dword ptr 5+[7] }
|
|
dd -2 { dd dword ptr 5-[7] }
|
|
dd 5 { dd dword ptr [5] }
|
|
|
|
dd Rec.Str { dd qword ptr Rec.Str }
|
|
dd Rec.Str { dd qword ptr Rec.Str[0] }
|
|
dd Rec.Arr { dd qword ptr Rec.Arr }
|
|
dd Rec.Arr+2 { dd qword ptr Rec.Arr[2] }
|
|
dd 12 { dd qword ptr 5[7] }
|
|
dd 12 { dd qword ptr 5+[7] }
|
|
dd -2 { dd qword ptr 5-[7] }
|
|
dd 5 { dd qword ptr [5] }
|
|
|
|
dd Rec.Str { dd tbyte ptr Rec.Str }
|
|
dd Rec.Str { dd tbyte ptr Rec.Str[0] }
|
|
dd Rec.Arr { dd tbyte ptr Rec.Arr }
|
|
dd Rec.Arr+2 { dd tbyte ptr Rec.Arr[2] }
|
|
dd 12 { dd tbyte ptr 5[7] }
|
|
dd 12 { dd tbyte ptr 5+[7] }
|
|
dd -2 { dd tbyte ptr 5-[7] }
|
|
dd 5 { dd tbyte ptr [5] }
|
|
end;
|
|
|
|
function CompareCode(cp, cp2: CodePointer; sz: Integer): Boolean;
|
|
var
|
|
I: Integer;
|
|
lastbyte: Byte;
|
|
begin
|
|
{$IFDEF FPC}
|
|
if CompareByte(cp^, cp2^, sz) <> 0 then
|
|
begin
|
|
CompareCode := False;
|
|
exit;
|
|
end;
|
|
{$ELSE}
|
|
for I := 0 to sz - 1 do
|
|
if PChar(cp)[I] <> PChar(cp2)[I] then
|
|
begin
|
|
CompareCode := False;
|
|
exit;
|
|
end;
|
|
{$ENDIF}
|
|
{ check also that the last byte is a retn instruction }
|
|
{ size differs at least between linux and windows, so leave the ret check away
|
|
lastbyte:=PByte(cp)[sz-1];
|
|
if lastbyte<>$C3 then
|
|
begin
|
|
CompareCode := False;
|
|
exit;
|
|
end;
|
|
}
|
|
CompareCode := True;
|
|
end;
|
|
|
|
procedure Error(N: Integer);
|
|
begin
|
|
Writeln('Error! ', N);
|
|
Halt(1);
|
|
end;
|
|
|
|
begin
|
|
if not CompareCode(CodePointer(@x), CodePointer(@x_verify), x_size) then
|
|
Error(1);
|
|
|
|
Writeln('Ok!');
|
|
end.
|