Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .MODEL SMALL
- .STACK 100h
- .DATA
- e DW ?
- eSign DW ?
- k DW ?
- zero DQ 0.0
- ten DQ 10.0
- tenword DW 10
- one DQ 1.0
- .CODE
- .386
- .387
- PUBLIC _myftoa
- ;extern void myftoa(double f, char str[])
- ; [BP+4] [BP+12]
- _myftoa PROC NEAR
- PUSH BP
- MOV BP, SP
- PUSH DI
- PUSH SI
- ;intiate variables
- MOV e, 0
- MOV DI, [BP+12]
- MOV SI,[BP+12]
- MOV eSign, 0
- ;save f=[BP+2]
- FLD QWORD PTR [BP+4]
- ;initiate str with '0'
- MOV CX,12
- strZero:
- MOV [DI],BYTE PTR '0'
- INC DI
- LOOP strZero
- MOV DI, [BP+12]
- ;check if f=0, if yes- set the string as needed
- FTST
- FSTSW AX
- SAHF
- JNE fIsNOtZero
- MOV [SI], BYTE PTR ' '
- MOV [SI+2],BYTE PTR '.'
- MOV [SI+8],BYTE PTR 'e'
- MOV [SI+9],BYTE PTR '+'
- JMP sof
- fIsNOtZero:
- ;check and save sign by comparing f and 0
- FTST
- FSTSW AX
- SAHF
- JA checkrange
- MOV [DI],BYTE PTR '-'
- ADD DI, 1
- FABS
- ;check f's range, above 10 or lower than 1
- checkrange:
- FCOM ten
- FSTSW AX
- SAHF
- JAE divLoop
- FCOM one
- FSTSW AX
- SAHF
- JB mulLoop
- JMP fIsNormal
- ;if f>=10.0
- divLoop:
- FDIV ten
- INC e
- FCOM ten
- FSTSW AX
- SAHF
- JAE divLoop
- MOV eSign, 1
- JMP fIsNormal
- ;if f<1.0
- mulLoop:
- FMUL ten
- INC e
- FCOM one
- FSTSW AX
- SAHF
- JB mulLoop
- ; in this point, f is between 1.0 and 10.0
- fIsNormal:
- MOV BX, 0
- ; insert normal f into the string using the algorithem requested
- strInsertLoop:
- FLD zero
- MOV k,0
- kLoop:
- FADD one
- INC k
- FCOM
- FSTSW AX
- SAHF
- JB kLoop
- DEC k ;k=k-1
- MOV CX, k
- ADD CX, '0'
- MOV [DI+BX],CX
- CMP BX, 0
- JNE notfirsttime
- INC DI
- MOV [DI], BYTE PTR '.' ; after the first char insert '.'
- notfirsttime:
- FSUB one
- FSUB
- FMUL ten
- INC BX
- CMP BX, 6
- JB strInsertLoop
- MOV [DI+BX],BYTE PTR 'e'
- INC BX
- CMP eSign, 0
- JNE ePos
- MOV [DI+BX],BYTE PTR '-'
- JMP enterE
- ePos:
- MOV [DI+BX],BYTE PTR '+'
- ;at last- enter the digits of e (1/2 digits)
- enterE:
- MOV AX, e
- MOV DX, 0
- DIV tenword
- ADD AX, '0'
- INC BX
- MOV [DI+BX],AX
- ADD DX, '0'
- INC BX
- MOV [DI+BX],DX
- sof:
- FFREE
- POP SI
- POP DI
- POP BP
- RET
- _myftoa ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement