home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CASM.ARJ / ATOI.ASM < prev    next >
Assembly Source File  |  1988-07-07  |  2KB  |  109 lines

  1. ;_ atoi.asm   Thu Jul  7 1988   Modified by: Walter Bright */
  2. ; Copyright (C) 1985-1987 by Northwest Software
  3. ; All Rights Reserved
  4. ; Written by Walter Bright
  5.  
  6.     include    macros.asm
  7.  
  8.     begcode    atoi
  9.  
  10. ;;;;;;;;;;;;;;;;;;;;;;;;;
  11. ; Take absolute value of integer.
  12.  
  13.     c_public abs
  14.  
  15. func    abs
  16.     push    BP
  17.     mov    BP,SP
  18.     mov    AX,P[BP]
  19.     cwd
  20.     xor    AX,DX        ;look, ma, no jumps!
  21.     sub    AX,DX        ;betch'a never thought of that!
  22.     pop    BP
  23.     ret
  24. c_endp    abs
  25.  
  26. ;;;;;;;;;;;;;;;;;;;;;;;;;
  27. ; Take absolute value of long.
  28.  
  29.     c_public labs
  30.  
  31. func    labs
  32.     push    BP
  33.     mov    BP,SP
  34.     ifdef MSC
  35.     mov    AX,P[BP]
  36.     mov    DX,P+2[BP]
  37.     tst    DX
  38.     jns    L2
  39.     neg32    DX,AX
  40.     else
  41.     mov    BX,P[BP]
  42.     mov    AX,P+2[BP]
  43.     tst    AX
  44.     jns    L2
  45.     neg32    AX,BX
  46.     endif
  47. L2:    pop    BP
  48.     ret
  49. c_endp    labs
  50.  
  51. ;;;;;;;;;;;;;;;;;;;;;;;;;
  52. ; Convert ascii string to integer.
  53. ; Use:
  54. ;    i = atoi(p);
  55.  
  56.     c_public atoi
  57.  
  58. func    atoi
  59.     push    BP
  60.     mov    BP,SP
  61.     .save    <SI>
  62.     if SPTR
  63.     mov    SI,P[BP]    ;get p
  64.     else
  65.     push    DS
  66.     lds    SI,P[BP]    ;DS:SI -> string
  67.     endif
  68.     cld
  69. A1:    lodsb
  70.     .if    AL e ' ', A1
  71.     .if    AL b 9, A3
  72.     .if    AL be 0Dh, A1    ;skip white space
  73.  
  74. A3:    clr    CX        ;accumulated result
  75.     mov    BX,CX        ;assume positive
  76.     clr    AH
  77.     .if    AL e '+', A4
  78.     .if    AL ne '-', A5
  79.     dec    BX        ;neg flag (BX = -1)
  80. A4:    lodsb
  81. A5:    sub    AL,'0'        ;to binary
  82.     jb    A2        ;not a digit
  83.     .if    AL ae 10, A2    ;not a digit
  84.  
  85.     ;CX = CX * 10 + AX
  86.     shl    CX,1
  87.     mov    DX,CX
  88.     shl    CX,1
  89.     shl    CX,1
  90.     add    CX,DX
  91.     add    CX,AX
  92.  
  93.     jmp    A4
  94.  
  95. A2:    mov    AX,CX
  96.     xor    AX,BX
  97.     sub    AX,BX        ;if (BX == -1), negate AX
  98.     if LPTR
  99.     pop    DS
  100.     endif
  101.     .restore <SI>
  102.     pop    BP
  103.     ret
  104. c_endp    atoi
  105.  
  106.     endcode    atoi
  107.  
  108.     end
  109.