* fixed test for PIC code on i386

git-svn-id: trunk@32434 -
This commit is contained in:
nickysn 2015-11-21 15:02:04 +00:00
parent c9204f6c5e
commit 79336c59de

View File

@ -7,12 +7,18 @@ program tw29010a;
{$apptype console} {$apptype console}
{$endif fpc} {$endif fpc}
type
PEspStruct = ^TEspStruct;
TEspStruct = record
esp_initial: longint;
esp_after_push: longint;
esp_final: longint;
end;
var var
Error: Boolean; Error: Boolean;
esp_initial: longint; Esp: PEspStruct;
esp_after_push: longint;
esp_final: longint;
global_proc: procedure; global_proc: procedure;
global_word: word; global_word: word;
@ -20,15 +26,18 @@ var
procedure check_esps(bytes: longint); procedure check_esps(bytes: longint);
begin begin
if (esp_initial - esp_after_push) <> bytes then with Esp^ do
begin begin
Writeln('Wrong push size, expected ', bytes, ', got ', esp_initial - esp_after_push); if (esp_initial - esp_after_push) <> bytes then
Error := True; begin
end; Writeln('Wrong push size, expected ', bytes, ', got ', esp_initial - esp_after_push);
if (esp_final - esp_after_push) <> bytes then Error := True;
begin end;
Writeln('Wrong pop size, expected ', bytes, ', got ', esp_final - esp_after_push); if (esp_final - esp_after_push) <> bytes then
Error := True; begin
Writeln('Wrong pop size, expected ', bytes, ', got ', esp_final - esp_after_push);
Error := True;
end;
end; end;
end; end;
@ -47,209 +56,234 @@ var
local_proc: procedure; local_proc: procedure;
local_word: word; local_word: word;
local_longint: longint; local_longint: longint;
local_espstruct: PEspStruct;
begin begin
local_espstruct := Esp;
{$ifndef FPC_PIC}
Writeln('testing push/pop global_proc'); Writeln('testing push/pop global_proc');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push global_proc push global_proc
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop global_proc pop global_proc
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_dword call check_dword
end; end;
Writeln('testing push/pop word [global_proc]'); Writeln('testing push/pop word [global_proc]');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word [global_proc] push word [global_proc]
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word [global_proc] pop word [global_proc]
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop word ptr global_proc'); Writeln('testing push/pop word ptr global_proc');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word ptr global_proc push word ptr global_proc
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word ptr global_proc pop word ptr global_proc
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop word ptr [global_proc]'); Writeln('testing push/pop word ptr [global_proc]');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word ptr [global_proc] push word ptr [global_proc]
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word ptr [global_proc] pop word ptr [global_proc]
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop global_word'); Writeln('testing push/pop global_word');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push global_word push global_word
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop global_word pop global_word
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop global_longint'); Writeln('testing push/pop global_longint');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push global_longint push global_longint
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop global_longint pop global_longint
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_dword call check_dword
end; end;
Writeln('testing push/pop word [global_longint]'); Writeln('testing push/pop word [global_longint]');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word [global_longint] push word [global_longint]
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word [global_longint] pop word [global_longint]
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop word ptr global_longint'); Writeln('testing push/pop word ptr global_longint');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word ptr global_longint push word ptr global_longint
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word ptr global_longint pop word ptr global_longint
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop word ptr [global_longint]'); Writeln('testing push/pop word ptr [global_longint]');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word ptr [global_longint] push word ptr [global_longint]
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word ptr [global_longint] pop word ptr [global_longint]
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
{$endif FPC_PIC}
Writeln('testing push/pop local_proc'); Writeln('testing push/pop local_proc');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push local_proc push local_proc
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop local_proc pop local_proc
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_dword call check_dword
end; end;
Writeln('testing push/pop word [local_proc]'); Writeln('testing push/pop word [local_proc]');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word [local_proc] push word [local_proc]
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word [local_proc] pop word [local_proc]
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop word ptr local_proc'); Writeln('testing push/pop word ptr local_proc');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word ptr local_proc push word ptr local_proc
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word ptr local_proc pop word ptr local_proc
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop word ptr [local_proc]'); Writeln('testing push/pop word ptr [local_proc]');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word ptr [local_proc] push word ptr [local_proc]
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word ptr [local_proc] pop word ptr [local_proc]
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop local_word'); Writeln('testing push/pop local_word');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push local_word push local_word
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop local_word pop local_word
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop local_longint'); Writeln('testing push/pop local_longint');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push local_longint push local_longint
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop local_longint pop local_longint
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_dword call check_dword
end; end;
Writeln('testing push/pop word [local_longint]'); Writeln('testing push/pop word [local_longint]');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word [local_longint] push word [local_longint]
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word [local_longint] pop word [local_longint]
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop word ptr local_longint'); Writeln('testing push/pop word ptr local_longint');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word ptr local_longint push word ptr local_longint
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word ptr local_longint pop word ptr local_longint
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
Writeln('testing push/pop word ptr [local_longint]'); Writeln('testing push/pop word ptr [local_longint]');
asm asm
mov esp_initial, esp mov ebx, local_espstruct
mov [ebx + TEspStruct.esp_initial], esp
push word ptr [local_longint] push word ptr [local_longint]
mov esp_after_push, esp mov [ebx + TEspStruct.esp_after_push], esp
pop word ptr [local_longint] pop word ptr [local_longint]
mov esp_final, esp mov [ebx + TEspStruct.esp_final], esp
mov esp, esp_initial mov esp, [ebx + TEspStruct.esp_initial]
call check_word call check_word
end; end;
end; end;
begin begin
Error := False; Error := False;
New(Esp);
testproc; testproc;
Dispose(Esp);
if Error then if Error then
begin begin
Writeln('Errors found!'); Writeln('Errors found!');