浏览代码

+ support bracketless references in the x86 intel syntax; ugly, but TP7 (and
perhaps also Delphi, TASM and MASM)-compatible

git-svn-id: trunk@38296 -

nickysn 7 年之前
父节点
当前提交
506d5fe30e
共有 3 个文件被更改,包括 40 次插入3 次删除
  1. 1 0
      .gitattributes
  2. 21 3
      compiler/x86/rax86int.pas
  3. 18 0
      tests/test/tasm22.pp

+ 1 - 0
.gitattributes

@@ -12518,6 +12518,7 @@ tests/test/tasm20.pp svneol=native#text/plain
 tests/test/tasm21.pp svneol=native#text/plain
 tests/test/tasm21.pp svneol=native#text/plain
 tests/test/tasm21a.pp svneol=native#text/plain
 tests/test/tasm21a.pp svneol=native#text/plain
 tests/test/tasm21b.pp svneol=native#text/plain
 tests/test/tasm21b.pp svneol=native#text/plain
+tests/test/tasm22.pp svneol=native#text/plain
 tests/test/tasm2a.pp svneol=native#text/plain
 tests/test/tasm2a.pp svneol=native#text/plain
 tests/test/tasm3.pp svneol=native#text/plain
 tests/test/tasm3.pp svneol=native#text/plain
 tests/test/tasm4.pp svneol=native#text/plain
 tests/test/tasm4.pp svneol=native#text/plain

+ 21 - 3
compiler/x86/rax86int.pas

@@ -1240,13 +1240,19 @@ Unit Rax86int;
         code : integer;
         code : integer;
         hreg : tregister;
         hreg : tregister;
         GotStar,GotOffset,HadVar,
         GotStar,GotOffset,HadVar,
-        GotPlus,Negative : boolean;
+        GotPlus,Negative,BracketlessReference : boolean;
         hl : tasmlabel;
         hl : tasmlabel;
         isseg: boolean;
         isseg: boolean;
         is_farproc_entry,hasofs,
         is_farproc_entry,hasofs,
         hastypecast: boolean;
         hastypecast: boolean;
       Begin
       Begin
-        Consume(AS_LBRACKET);
+        if actasmtoken=AS_LBRACKET then
+          begin
+            Consume(AS_LBRACKET);
+            BracketlessReference:=false;
+          end
+        else
+          BracketlessReference:=true;
         if not(oper.opr.typ in [OPR_LOCAL,OPR_REFERENCE]) then
         if not(oper.opr.typ in [OPR_LOCAL,OPR_REFERENCE]) then
           oper.InitRef;
           oper.InitRef;
         GotStar:=false;
         GotStar:=false;
@@ -1636,12 +1642,24 @@ Unit Rax86int;
 
 
             AS_RBRACKET :
             AS_RBRACKET :
               begin
               begin
-                if GotPlus or GotStar then
+                if GotPlus or GotStar or BracketlessReference then
                   Message(asmr_e_invalid_reference_syntax);
                   Message(asmr_e_invalid_reference_syntax);
                 Consume(AS_RBRACKET);
                 Consume(AS_RBRACKET);
                 break;
                 break;
               end;
               end;
 
 
+            AS_SEPARATOR,
+            AS_END,
+            AS_COMMA:
+              begin
+                if not BracketlessReference then
+                  begin
+                    Message(asmr_e_invalid_reference_syntax);
+                    RecoverConsume(true);
+                  end;
+                break;
+              end;
+
             else
             else
               Begin
               Begin
                 Message(asmr_e_invalid_reference_syntax);
                 Message(asmr_e_invalid_reference_syntax);

+ 18 - 0
tests/test/tasm22.pp

@@ -0,0 +1,18 @@
+{ %CPU=i8086 }
+
+{$IFDEF FPC}
+{$MODE TP}
+{$ENDIF}
+
+program tasm22;
+
+var
+  p: pointer;
+
+procedure t; assembler;
+asm
+  call dword ptr es:p
+end;
+
+begin
+end.