Browse Source

* adjust parameters of far procedures for the extra segment that's pushed on the stack by the far call instruction

git-svn-id: trunk@24818 -
nickysn 12 years ago
parent
commit
6fdd48878f
1 changed files with 24 additions and 8 deletions
  1. 24 8
      compiler/i8086/cpupara.pas

+ 24 - 8
compiler/i8086/cpupara.pas

@@ -495,7 +495,11 @@ unit cpupara;
                   paralen:=16;
                 paraloc^.reference.offset:=parasize;
                 if side=calleeside then
-                  inc(paraloc^.reference.offset,target_info.first_parm_offset);
+                  begin
+                    inc(paraloc^.reference.offset,target_info.first_parm_offset);
+                    if po_far in p.procoptions then
+                      inc(paraloc^.reference.offset,2);
+                  end;
                 parasize:=align(parasize+paralen,varalign);
               end
             else
@@ -537,11 +541,15 @@ unit cpupara;
                     varalign:=used_align(size_2_align(l),paraalign,paraalign);
                     paraloc^.reference.offset:=parasize;
                     if side=calleeside then
-                      if not(po_nostackframe in p.procoptions) then
-                        inc(paraloc^.reference.offset,target_info.first_parm_offset)
-                      else
-                        { return addres }
-                        inc(paraloc^.reference.offset,4);
+                      begin
+                        if not(po_nostackframe in p.procoptions) then
+                          inc(paraloc^.reference.offset,target_info.first_parm_offset)
+                        else
+                          { return addres }
+                          inc(paraloc^.reference.offset,2);
+                        if po_far in p.procoptions then
+                          inc(paraloc^.reference.offset,2);
+                      end;
                     parasize:=align(parasize+l,varalign);
                     dec(paralen,l);
                     firstparaloc:=false;
@@ -660,7 +668,11 @@ unit cpupara;
                               varalign:=used_align(size_2_align(paralen),paraalign,paraalign);
                               paraloc^.reference.offset:=parasize;
                               if side=calleeside then
-                                inc(paraloc^.reference.offset,target_info.first_parm_offset);
+                                begin
+                                  inc(paraloc^.reference.offset,target_info.first_parm_offset);
+                                  if po_far in p.procoptions then
+                                    inc(paraloc^.reference.offset,2);
+                                end;
                               parasize:=align(parasize+paralen,varalign);
                             end
                           else
@@ -701,7 +713,11 @@ unit cpupara;
                                   varalign:=used_align(size_2_align(l),paraalign,paraalign);
                                   paraloc^.reference.offset:=parasize;
                                   if side=calleeside then
-                                    inc(paraloc^.reference.offset,target_info.first_parm_offset);
+                                    begin
+                                      inc(paraloc^.reference.offset,target_info.first_parm_offset);
+                                      if po_far in p.procoptions then
+                                        inc(paraloc^.reference.offset,2);
+                                    end;
                                   parasize:=align(parasize+l,varalign);
                                   dec(paralen,l);
                                   firstparaloc:=false;