Advertisement
yosikadoshi

hw4

Jun 26th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .MODEL SMALL
  2. .STACK 100h
  3. .DATA
  4.  
  5. e       DW ?
  6. eSign   DW ?
  7. k       DW ?
  8. zero    DQ 0.0
  9. ten     DQ 10.0
  10. tenword DW 10
  11. one     DQ 1.0
  12.  
  13. .CODE
  14. .386
  15. .387
  16.  
  17. PUBLIC _myftoa
  18. ;extern void myftoa(double f, char str[])
  19. ;                   [BP+4]      [BP+12]
  20. _myftoa PROC NEAR
  21.     PUSH BP
  22.     MOV BP, SP
  23.     PUSH DI
  24.     PUSH SI
  25.    
  26. ;intiate variables
  27.     MOV e, 0
  28.     MOV DI, [BP+12]
  29.     MOV SI,[BP+12]
  30.     MOV eSign, 0
  31.     ;save f=[BP+2]
  32.     FLD QWORD PTR [BP+4]
  33.    
  34.  ;initiate str with '0'
  35.     MOV CX,12
  36.     strZero:
  37.     MOV [DI],BYTE PTR '0'
  38.     INC DI
  39.     LOOP strZero
  40.    
  41.     MOV DI, [BP+12]
  42.    
  43. ;check if f=0, if yes- set the string as needed
  44.     FTST
  45.     FSTSW AX
  46.     SAHF
  47.     JNE fIsNOtZero
  48.     MOV [SI], BYTE PTR ' '
  49.     MOV [SI+2],BYTE PTR '.'
  50.     MOV [SI+8],BYTE PTR 'e'
  51.     MOV [SI+9],BYTE PTR '+'
  52.     JMP sof
  53. fIsNOtZero:
  54. ;check and save sign by comparing f and 0
  55.     FTST
  56.     FSTSW AX
  57.     SAHF
  58.     JA checkrange
  59.     MOV [DI],BYTE PTR '-'
  60.     ADD DI, 1
  61.     FABS
  62.    
  63. ;check f's range, above 10 or lower than 1
  64. checkrange:
  65.     FCOM ten
  66.     FSTSW AX
  67.     SAHF
  68.     JAE divLoop
  69.     FCOM one
  70.     FSTSW AX
  71.     SAHF
  72.     JB mulLoop
  73.     JMP fIsNormal
  74. ;if f>=10.0
  75. divLoop:
  76.     FDIV ten
  77.     INC e
  78.     FCOM ten
  79.     FSTSW AX
  80.     SAHF
  81.     JAE divLoop
  82.     MOV eSign, 1
  83.     JMP fIsNormal
  84.    
  85. ;if f<1.0
  86. mulLoop:
  87.     FMUL ten
  88.     INC e
  89.     FCOM one
  90.     FSTSW AX
  91.     SAHF
  92.     JB mulLoop
  93.    
  94. ; in this point, f is between 1.0 and 10.0
  95. fIsNormal:
  96.     MOV BX, 0
  97. ; insert normal f into the string using the algorithem requested
  98. strInsertLoop:
  99.     FLD zero
  100.     MOV k,0
  101. kLoop:
  102.     FADD one
  103.     INC k
  104.     FCOM
  105.     FSTSW AX
  106.     SAHF
  107.     JB kLoop
  108.     DEC k ;k=k-1
  109.     MOV CX, k
  110.     ADD CX, '0'
  111.     MOV [DI+BX],CX
  112.     CMP BX, 0
  113.     JNE notfirsttime
  114.     INC DI
  115.     MOV [DI], BYTE PTR '.' ; after the first char insert '.'
  116. notfirsttime:
  117.     FSUB one
  118.     FSUB
  119.     FMUL ten
  120.     INC BX
  121.     CMP BX, 6
  122.     JB strInsertLoop
  123.  
  124.     MOV [DI+BX],BYTE PTR 'e'
  125.     INC BX
  126.  
  127.     CMP eSign, 0
  128.     JNE ePos
  129.     MOV [DI+BX],BYTE PTR '-'
  130.     JMP enterE
  131. ePos:
  132.     MOV [DI+BX],BYTE PTR '+'
  133.  
  134. ;at last- enter the digits of e (1/2 digits)
  135. enterE:
  136.     MOV AX, e
  137.     MOV DX, 0
  138.     DIV tenword
  139.     ADD AX, '0'
  140.     INC BX
  141.     MOV [DI+BX],AX
  142.     ADD DX, '0'
  143.     INC BX
  144.     MOV [DI+BX],DX
  145.    
  146.    
  147. sof:
  148.     FFREE
  149.     POP SI
  150.     POP DI
  151.     POP BP
  152.     RET
  153. _myftoa ENDP
  154. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement