[Back to STRINGS SWAG index]  [Back to Main SWAG index]  [Original]

(*
===========================================================================
 BBS: Canada Remote Systems
Date: 09-16-93 (08:30)             Number: 27395
From: HELGE HELGESEN               Refer#: NONE
  To: KURTIS LINDQVIST              Recvd: NO
Subj: Longint to HEX                 Conf: (552) R-TP
---------------------------------------------------------------------------
Here's a simple - unoptimized - function to convert a
longint to hex.
*)
function LongInt2Str(no: longint): string; assembler;
const
  Digits: array[0..$f] of char =
    ( '0', '1', '2', '3', '4' ,'5', '6', '7', '8', '9', 'A', 'B', 'C',
      'D', 'E', 'F'
    );
asm
  les  di, @Result { get address to result }
  mov  al, 8 { size of result }
  stosb
  lea  bx, Digits { get adress to digit table }
  mov  dx, word ptr no+2
  mov  cx, 2
@1:
  mov  al, dh
  shr  al, 4
  xlat
  stosb
  mov  al, dh
  and  al, 15
  xlat
  stosb
  mov  al, dl
  shr  al, 4
  xlat
  stosb
  mov  al, dl
  and  al, 15
  xlat
  stosb
  mov  dx, word ptr no
  loop @1
end;
---
 þ RM 1.2 00308 þ C program run.  C program crash.  C programmer quit
 * Midnight Sun BBS, Norway +47 81 84545 HST/DS, 9 Gb
 * PostLink(tm) v1.07  MIDNIGHT (#602) : RelayNet(tm)
===========================================================================
 BBS: Canada Remote Systems
Date: 09-16-93 (20:19)             Number: 27393
From: PHIL NICKELL                 Refer#: NONE
  To: KURTIS LINDQVIST              Recvd: NO
Subj: Longint to HEX                 Conf: (552) R-TP
---------------------------------------------------------------------------
KL³Allright, I have been struggling with this problem for awhile but I give up.
  ³A friend of mine wrote a unit that would convert a longint to a HEX number in
  ³string. This is for a program that stores one file for each user (it's an ord
  ³door), the name of the file is equal to the HEX number representing the

 I'll include two functions named HEXLONG that produce identical
 results.  The first is pure classic Turbo Pascal, the second is a Turbo
 Pascal Assembler function that is blinding-speed vs size optimized.
 You pass them a longint value, they return an 8 byte string.  Voila.
 Take your pick.


(* Return a 8 byte ascii string of the hex value of the longint
   argument *)
FUNCTION  Hexlong (argument : longint): namestr;
   var i      :longint;
       res    :namestr;
   Const
       HexTable  :array[0..15] of char = '0123456789ABCDEF';
  begin
    res[0] := #8;
    for i := 0 to 7 do
      res[8-i] := HexTable[ argument shr (i shl 2) and $f];
    hexlong := res;
  end;

FUNCTION  Hexlong (argument : longint): namestr; Assembler;
  asm
     cld
     les    di,@result
     mov    al,8                   { store string length }
     stosb
     mov    cl, 4                  { shift count }

     mov    dx,Word Ptr Argument+2 { hi word }
     call   @1                     { convert dh to ascii }
     mov    dh, dl                 { lo byte of hi word }
     call   @1                     { convert dh to ascii }
     mov    dx,Word Ptr Argument   { lo word }
     call   @1                     { convert dh to ascii }
     mov    dh, dl                 { lo byte of lo word }
     call   @1                     { convert dh to ascii }
     jmp    @2

   @1:
     mov    al, dh                 { 1 byte }
     and    al, 0fh                { low nybble }
     add    al, 90h
     daa
     adc    al, 40h
     daa
     mov    ah, al                 { store }
     mov    al, dh                 { 1 byte }
     shr    al, cl                 { get high nybble }
     add    al, 90h
     daa
     adc    al, 40h
     daa
     stosw                         { move characters to result }
     retn                          { return near }
   @2:
  end;

begin
  Writeln( Hexlong($1234ABCD) );
end.
---
 þ SLMR 2.1a þ doesn't take a rocket scientist to be a rocket scientist
 þ KMail 3.00d Twin Peaks (303)-651-0225 þ Home of KMail þ
 þ RNET 2.00b: þ Twin Peaks BBS þ (303)-651-0225, Longmont, Co.
 * The DC Information Exchange (703)836-0748
 * PostLink(tm) v1.07  DCINFO (#16) : MetroLink(tm)

[Back to STRINGS SWAG index]  [Back to Main SWAG index]  [Original]