Quellcode durchsuchen

* 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 -

nickysn vor 7 Jahren
Ursprung
Commit
d318ab086a
4 geänderte Dateien mit 124 neuen und 3 gelöschten Zeilen
  1. 2 0
      .gitattributes
  2. 13 3
      compiler/rautils.pas
  3. 49 0
      tests/test/cpu16/i8086/tasmabs1.pp
  4. 60 0
      tests/test/cpu16/i8086/tasmabs2.pp

+ 2 - 0
.gitattributes

@@ -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

+ 13 - 3
compiler/rautils.pas

@@ -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 - 0
tests/test/cpu16/i8086/tasmabs1.pp

@@ -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 - 0
tests/test/cpu16/i8086/tasmabs2.pp

@@ -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.