mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 01:08:07 +02:00
85 lines
2.3 KiB
ObjectPascal
85 lines
2.3 KiB
ObjectPascal
{ %CPU=x86_64 }
|
||
|
||
program tasm23b;
|
||
|
||
{$ASMMODE INTEL}
|
||
{$S-}
|
||
|
||
const
|
||
t_size = 25;
|
||
procedure t; assembler;
|
||
asm
|
||
mov eax, [rbx[5]][rdi][54][-17][45][4] { mov eax, [rbx+rdi+5Bh] }
|
||
mov eax, [[rbx+5]+[rdi+54]+[-17]+[45]+[4]] { mov eax, [rbx+rdi+5Bh] }
|
||
mov ebx, [5[7]] { mov ebx, [000Ch] }
|
||
mov ebx, [5+[7]] { mov ebx, [000Ch] }
|
||
end;
|
||
procedure t_verify; assembler;
|
||
asm
|
||
mov eax, [rbx+rdi+5Bh] { mov eax, [rbx[5]][rdi][54][-17][45][4] }
|
||
mov eax, [rbx+rdi+5Bh] { mov eax, [[rbx+5]+[rdi+54]+[-17]+[45]+[4]] }
|
||
mov ebx, [000Ch] { mov ebx, [5[7]] }
|
||
mov ebx, [000Ch] { mov ebx, [5+[7]] }
|
||
end;
|
||
|
||
const
|
||
t2_size = 37;
|
||
procedure t2; assembler;
|
||
var
|
||
locl: longword;
|
||
asm
|
||
mov eax, locl { mov еax, [rbp-08] }
|
||
mov eax, fs:locl { mov еax, fs:[rbp-04] }
|
||
mov eax, [fs:locl] { mov еax, fs:[rbp-04] }
|
||
mov eax, [fs:[locl]] { mov еax, fs:[rbp-04] }
|
||
mov eax, fs:locl[5] { mov еax, fs:[rbp+01] }
|
||
mov eax, fs:5[locl] { mov еax, fs:[rbp+01] }
|
||
end;
|
||
procedure t2_verify; assembler;
|
||
var
|
||
locl: longword;
|
||
asm
|
||
mov eax, [rbp-04] { mov еax, locl }
|
||
mov eax, fs:[rbp-04] { mov еax, fs:locl }
|
||
mov eax, fs:[rbp-04] { mov еax, [fs:locl] }
|
||
mov eax, fs:[rbp-04] { mov еax, [fs:[locl]] }
|
||
mov eax, fs:[rbp+01] { mov еax, fs:locl[5] }
|
||
mov eax, fs:[rbp+01] { mov еax, fs:5[locl] }
|
||
end;
|
||
|
||
function CompareCode(cp, cp2: CodePointer; sz: Integer): Boolean;
|
||
var
|
||
lastbyte: Byte;
|
||
begin
|
||
if CompareByte(cp^, cp2^, sz) <> 0 then
|
||
begin
|
||
CompareCode := False;
|
||
exit;
|
||
end;
|
||
{ 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(@t), CodePointer(@t_verify), t_size) then
|
||
Error(1);
|
||
if not CompareCode(CodePointer(@t2), CodePointer(@t2_verify), t2_size) then
|
||
Error(2);
|
||
|
||
Writeln('Ok!');
|
||
end.
|