Browse Source

* fix from peter i386.inc to circumvent ebx destroying

marco 22 years ago
parent
commit
41e3249c4b
1 changed files with 35 additions and 21 deletions
  1. 35 21
      rtl/i386/i386.inc

+ 35 - 21
rtl/i386/i386.inc

@@ -1159,7 +1159,8 @@ end;
 {$define FPC_SYSTEM_HAS_INT_STR_LONGINT}
 procedure int_str(l : longint;var s : string);
 var
-  buffer : array[0..11] of byte;
+  buffer : array[0..15] of byte;
+  isneg  : byte;
 begin
   { Workaround: }
   if l=$80000000 then
@@ -1169,31 +1170,39 @@ begin
    end;
   asm
         movl    l,%eax          // load Integer
-        movl    s,%edi          // Load String address
         xorl    %ecx,%ecx       // String length=0
-        xorl    %ebx,%ebx       // Buffer length=0
+        leal    buffer,%ebx
         movl    $0x0a,%esi      // load 10 as dividing constant.
+        movb    $0,isneg
         orl     %eax,%eax       // Sign ?
         jns     .LM2
+        movb    $1,isneg
         neg     %eax
-        movb    $0x2d,1(%edi)   // put '-' in String
-        incl    %ecx
 .LM2:
         cltd
         idivl   %esi
         addb    $0x30,%dl       // convert Rest to ASCII.
-        movb    %dl,-12(%ebp,%ebx)
+        movb    %dl,(%ebx)
+        incl    %ecx
         incl    %ebx
         cmpl    $0,%eax
         jnz     .LM2
-        { copy String }
-.LM3:
-        movb    -13(%ebp,%ebx),%al    // -13 because EBX is decreased only later
-        movb    %al,1(%edi,%ecx)
+        { now copy the string }
+        movl    s,%edi          // Load String address
+        cmpb    $0,isneg
+        je      .LM3
+        movb    $0x2d,(%ebx)
         incl    %ecx
-        decl    %ebx
-        jnz     .LM3
+        incl    %ebx
+.LM3:
         movb    %cl,(%edi)      // Copy String length
+        incl    %edi
+.LM4:
+        decl    %ebx
+        movb    (%ebx),%al
+        stosb
+        decl    %ecx
+        jnz     .LM4
   end ['eax','ecx','edx','ebx','esi','edi'];
 end;
 
@@ -1201,30 +1210,32 @@ end;
 {$define FPC_SYSTEM_HAS_INT_STR_LONGWORD}
 procedure int_str(c : longword;var s : string);
 var
-  buffer : array[0..14] of byte;
+  buffer : array[0..15] of byte;
 begin
   asm
         movl    c,%eax          // load CARDINAL
-        movl    s,%edi          // Load String address
         xorl    %ecx,%ecx       // String length=0
-        xorl    %ebx,%ebx       // Buffer length=0
+        leal    buffer,%ebx
         movl    $0x0a,%esi      // load 10 as dividing constant.
 .LM4:
         xorl    %edx,%edx
         divl    %esi
         addb    $0x30,%dl       // convert Rest to ASCII.
-        movb    %dl,-12(%ebp,%ebx)
+        movb    %dl,(%ebx)
+        incl    %ecx
         incl    %ebx
         cmpl    $0,%eax
         jnz     .LM4
         { now copy the string }
+        movl    s,%edi          // Load String address
+        movb    %cl,(%edi)      // Copy String length
+        incl    %edi
 .LM5:
-        movb    -13(%ebp,%ebx),%al    // -13 because EBX is decreased only later
-        movb    %al,1(%edi,%ecx)
-        incl    %ecx
         decl    %ebx
+        movb    (%ebx),%al
+        stosb
+        decl    %ecx
         jnz     .LM5
-        movb    %cl,(%edi)      // Copy String length
   end ['eax','ecx','edx','ebx','esi','edi'];
 end;
 
@@ -1319,7 +1330,10 @@ end;
 
 {
   $Log$
-  Revision 1.50  2003-10-23 17:01:27  peter
+  Revision 1.51  2003-10-27 09:16:57  marco
+   * fix from peter i386.inc to circumvent ebx destroying
+
+  Revision 1.50  2003/10/23 17:01:27  peter
     * save edi,ebx,esi in int_str
 
   Revision 1.49  2003/10/16 21:28:40  peter