Переглянути джерело

* eliminated the dual initialization of DS in interrupt procedures in the huge
memory model

git-svn-id: trunk@31519 -

nickysn 10 роки тому
батько
коміт
98ec7a2211
2 змінених файлів з 11 додано та 2 видалено
  1. 2 1
      compiler/i8086/cgcpu.pas
  2. 9 1
      compiler/x86/cgx86.pas

+ 2 - 1
compiler/i8086/cgcpu.pas

@@ -1777,7 +1777,8 @@ unit cgcpu;
               end
             else
               begin
-                if current_settings.x86memorymodel=mm_huge then
+                if (current_settings.x86memorymodel=mm_huge) and
+                    not (po_interrupt in current_procinfo.procdef.procoptions) then
                   list.concat(Taicpu.Op_reg(A_POP,S_W,NR_DS));
                 generate_leave(list);
               end;

+ 9 - 1
compiler/x86/cgx86.pas

@@ -2893,6 +2893,13 @@ unit cgx86;
                     list.concat(Taicpu.Op_reg_reg(A_MOV,S_W,NR_AX,NR_DS));
                   end;
               end
+            else if current_settings.x86memorymodel=mm_huge then
+              begin
+                reference_reset(fardataseg,0);
+                fardataseg.refaddr:=addr_fardataseg;
+                list.concat(Taicpu.Op_ref_reg(A_MOV,S_W,fardataseg,NR_AX));
+                list.concat(Taicpu.Op_reg_reg(A_MOV,S_W,NR_AX,NR_DS));
+              end
             else
               begin
                 reference_reset(dgroup,0);
@@ -2977,7 +2984,8 @@ unit cgx86;
               end;
 
 {$ifdef i8086}
-              if current_settings.x86memorymodel=mm_huge then
+              if (current_settings.x86memorymodel=mm_huge) and
+                 not (po_interrupt in current_procinfo.procdef.procoptions) then
                 begin
                   list.concat(Taicpu.op_reg(A_PUSH,S_W,NR_DS));
                   reference_reset(fardataseg,0);