Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- asciiToFloat:
- ;; Converts an ascii string to a floating point
- ;; If at any point it finds a syntax error it returns zero
- ;; and stops execution.
- ;; Result is returned in ST
- ;; Regex for matching numbers (For the sake of claire's brain)
- ;; [-+]?[0-9]*\.[0-9]+
- push ebp
- mov ebp, esp
- push esi
- fldz ; Initialize ST as 0
- fldz st(1)
- cld
- mov esi, [ebp+8]
- ;; We're using 0 in ah to "remember" a positive number, 1 for negative
- mov ah, 0 ; Assume Positive until proven otherwise
- ;; Test if the first byte was a sign or a digit or a decimal
- lodsb
- testForPlus:
- cmp al, 2bh ; Test against +
- jne testForMinus
- lodsb ; No need to mov ah, 0, it's already done
- jmp testForDigit
- testForMinus:
- cmp al, 2dh ; Test against -
- jne testForDigit
- mov ah, 1
- lodsb
- testForDigit:
- mov ecx, 1
- wholePartLoop:
- cmp al, 30h ; compare against [0-9]
- jl testForPoint
- cmp al, 39h
- jg errorExit ; If this happens something is wrong
- sub al, 30h ; Convert to decimal
- fimul ecx
- fiadd al
- mul ecx, 10
- lodsb
- jmp wholePartLoop
- testForPoint:
- cmp al, 2eh ; Test against .
- jne errorExit ; Again, failing this means something is wrong
- lodsb
- mov ecx, 1
- mov edx, 1
- fxch
- fractionConvert:
- cmp al, 0
- je fractionize
- cmp al, 30h
- jl errorExit
- cmp al, 39h
- jg errorExit
- sub al, 30h
- fimul ecx
- mul ecx, 10
- lodsb
- jmp fractionConvert
- fractionize:
- fidiv ecx
- fadd
- cmp ah, 1
- jne endAsciiToFloat
- fimul -1
- endAsciiToFloat:
- pop ebp
- ret
- errorExit:
- fldz
- jmp endAsciiToFloat
Add Comment
Please, Sign In to add comment