mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 07:09:29 +02:00
* when handling absolute vars from within intel inline assembly, take the
absolute var size into account (not the type of the var it points to or no size at all, if it points to a fixed address) git-svn-id: trunk@37525 -
This commit is contained in:
parent
eef6e65730
commit
d318ab086a
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -12109,6 +12109,8 @@ tests/test/cpu16/i8086/tasm16_32_1.pp svneol=native#text/pascal
|
||||
tests/test/cpu16/i8086/tasm16_32_2.pp svneol=native#text/pascal
|
||||
tests/test/cpu16/i8086/tasm16_32_3.pp svneol=native#text/pascal
|
||||
tests/test/cpu16/i8086/tasm16_32_4.pp svneol=native#text/pascal
|
||||
tests/test/cpu16/i8086/tasmabs1.pp svneol=native#text/pascal
|
||||
tests/test/cpu16/i8086/tasmabs2.pp svneol=native#text/pascal
|
||||
tests/test/cpu16/i8086/tasmseg1.pp svneol=native#text/pascal
|
||||
tests/test/cpu16/i8086/tfarcal1.pp svneol=native#text/pascal
|
||||
tests/test/cpu16/i8086/tfarcal2.pp svneol=native#text/pascal
|
||||
|
@ -806,6 +806,7 @@ var
|
||||
srsymtable : TSymtable;
|
||||
indexreg : tregister;
|
||||
plist : ppropaccesslistitem;
|
||||
size_set_from_absolute : boolean = false;
|
||||
Begin
|
||||
SetupVar:=false;
|
||||
asmsearchsym(s,sym,srsymtable);
|
||||
@ -820,7 +821,11 @@ Begin
|
||||
plist:=tabsolutevarsym(sym).ref.firstsym;
|
||||
if assigned(plist) and
|
||||
(plist^.sltype=sl_load) then
|
||||
sym:=plist^.sym
|
||||
begin
|
||||
setvarsize(tabstractvarsym(sym));
|
||||
size_set_from_absolute:=true;
|
||||
sym:=plist^.sym;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Message(asmr_e_unsupported_symbol_type);
|
||||
@ -831,6 +836,9 @@ Begin
|
||||
begin
|
||||
initref;
|
||||
opr.ref.offset:=tabsolutevarsym(sym).addroffset;
|
||||
setvarsize(tabstractvarsym(sym));
|
||||
size_set_from_absolute:=true;
|
||||
hasvar:=true;
|
||||
Result:=true;
|
||||
exit;
|
||||
end;
|
||||
@ -850,7 +858,8 @@ Begin
|
||||
setconst(tfieldvarsym(sym).fieldoffset div 8)
|
||||
else
|
||||
Message(asmr_e_packed_element);
|
||||
setvarsize(tabstractvarsym(sym));
|
||||
if not size_set_from_absolute then
|
||||
setvarsize(tabstractvarsym(sym));
|
||||
hasvar:=true;
|
||||
SetupVar:=true;
|
||||
end;
|
||||
@ -905,7 +914,8 @@ Begin
|
||||
SetSize(sizeof(pint),false);
|
||||
end;
|
||||
end;
|
||||
setvarsize(tabstractvarsym(sym));
|
||||
if not size_set_from_absolute then
|
||||
setvarsize(tabstractvarsym(sym));
|
||||
hasvar:=true;
|
||||
SetupVar:=true;
|
||||
Exit;
|
||||
|
49
tests/test/cpu16/i8086/tasmabs1.pp
Normal file
49
tests/test/cpu16/i8086/tasmabs1.pp
Normal file
@ -0,0 +1,49 @@
|
||||
{ %cpu=i8086 }
|
||||
|
||||
{ this test is Turbo Pascal 7 compatible }
|
||||
|
||||
program tasmabs1;
|
||||
|
||||
{$IFDEF FPC}
|
||||
{$ASMMODE INTEL}
|
||||
{$ASMCPU 80386}
|
||||
{$ENDIF}
|
||||
|
||||
var
|
||||
barr: array [0..100] of byte;
|
||||
l: longint absolute barr;
|
||||
w: word absolute barr;
|
||||
b: byte absolute barr;
|
||||
begin
|
||||
{$IFDEF FPC}
|
||||
FillChar(barr, SizeOf(barr), $ff);
|
||||
asm
|
||||
mov l, 4
|
||||
end;
|
||||
if (barr[0] <> 4) or (barr[1] <> 0) or (barr[2] <> 0) or
|
||||
(barr[3] <> 0) or (barr[4] <> 255) then
|
||||
begin
|
||||
Writeln('Error!');
|
||||
Halt(1);
|
||||
end;
|
||||
{$ENDIF}
|
||||
FillChar(barr, SizeOf(barr), $ff);
|
||||
asm
|
||||
mov w, 2
|
||||
end;
|
||||
if (barr[0] <> 2) or (barr[1] <> 0) or (barr[2] <> 255) then
|
||||
begin
|
||||
Writeln('Error!');
|
||||
Halt(1);
|
||||
end;
|
||||
FillChar(barr, SizeOf(barr), $ff);
|
||||
asm
|
||||
mov b, 1
|
||||
end;
|
||||
if (barr[0] <> 1) or (barr[1] <> 255) or (barr[2] <> 255) then
|
||||
begin
|
||||
Writeln('Error!');
|
||||
Halt(1);
|
||||
end;
|
||||
Writeln('Ok!');
|
||||
end.
|
60
tests/test/cpu16/i8086/tasmabs2.pp
Normal file
60
tests/test/cpu16/i8086/tasmabs2.pp
Normal file
@ -0,0 +1,60 @@
|
||||
{ %cpu=i8086 }
|
||||
|
||||
{ this test is Turbo Pascal 7 compatible }
|
||||
|
||||
program tasmabs2;
|
||||
|
||||
{$IFDEF FPC}
|
||||
{$ASMMODE INTEL}
|
||||
{$ASMCPU 80386}
|
||||
{$ENDIF}
|
||||
|
||||
var
|
||||
l: longint absolute $B800:0;
|
||||
w: word absolute $B800:0;
|
||||
b: byte absolute $B800:0;
|
||||
begin
|
||||
{$IFDEF FPC}
|
||||
MemL[$B800:0] := MaxLongInt;
|
||||
MemL[$B800:4] := MaxLongInt;
|
||||
asm
|
||||
mov ax, 0b800h
|
||||
mov es, ax
|
||||
seges
|
||||
mov l, 4
|
||||
end;
|
||||
if (Mem[$B800:0] <> 4) or (Mem[$B800:1] <> 0) or (Mem[$B800:2] <> 0) or
|
||||
(Mem[$B800:3] <> 0) or (Mem[$B800:4] <> 255) then
|
||||
begin
|
||||
Writeln('Error!');
|
||||
Halt(1);
|
||||
end;
|
||||
{$ENDIF}
|
||||
MemL[$B800:0] := MaxLongInt;
|
||||
MemL[$B800:4] := MaxLongInt;
|
||||
asm
|
||||
mov ax, 0b800h
|
||||
mov es, ax
|
||||
seges
|
||||
mov w, 2
|
||||
end;
|
||||
if (Mem[$B800:0] <> 2) or (Mem[$B800:1] <> 0) or (Mem[$B800:2] <> 255) then
|
||||
begin
|
||||
Writeln('Error!');
|
||||
Halt(1);
|
||||
end;
|
||||
MemL[$B800:0] := MaxLongInt;
|
||||
MemL[$B800:4] := MaxLongInt;
|
||||
asm
|
||||
mov ax, 0b800h
|
||||
mov es, ax
|
||||
seges
|
||||
mov b, 1
|
||||
end;
|
||||
if (Mem[$B800:0] <> 1) or (Mem[$B800:1] <> 255) or (Mem[$B800:2] <> 255) then
|
||||
begin
|
||||
Writeln('Error!');
|
||||
Halt(1);
|
||||
end;
|
||||
Writeln('Ok!');
|
||||
end.
|
Loading…
Reference in New Issue
Block a user