Skip to content

Instantly share code, notes, and snippets.

@taoky
Created February 9, 2020 09:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save taoky/b40a1e71020f6c6884dc1b0351735e53 to your computer and use it in GitHub Desktop.
Save taoky/b40a1e71020f6c6884dc1b0351735e53 to your computer and use it in GitHub Desktop.
FTOA and ATOF procedure assembly for 80387
.model SMALL
.386
.STACK 100H
.DATA
TEMP DW ?
NUMB REAL4 ?
STRING DB 1024 DUP(0)
WHOLE DD ?
FRACT DD ?
TEN REAL4 10.0
MINUS DB 0
POINT DB 0
DIGIT DW 0
.CODE
.STARTUP
; fill in your code
.EXIT
ATOF PROC NEAR USES EAX EBX ECX ESI
; from Introduction to 80x86 Assembly Language and Computer Architecture
; store from STRING to NUMB
MOV MINUS, 0
MOV POINT, 0
FINIT
FLD1 ; push 1
FLDZ ; push 0
XOR ECX, ECX
CMP STRING[ECX], '-'
JNE CHECKPNT
MOV MINUS, 1
INC ECX
CHECKPNT:
MOV AL, STRING[ECX]
CMP AL, '.'
JNE ENDPOINT
MOV POINT, 1
JMP NEXTCHAR
ENDPOINT:
CMP AL, '0'
JL NOTDIGIT
CMP AL, '9'
JG NOTDIGIT
AND AX, 0FH
MOV DIGIT, AX
FMUL TEN
FIADD DIGIT
CMP POINT, 1
JNE NEXTCHAR
FXCH
FMUL TEN
FXCH
NEXTCHAR:
INC ECX
JMP CHECKPNT
NOTDIGIT:
FDIVR
CMP MINUS, 1
JNE ATOF_RET
FCHS
ATOF_RET:
FST NUMB
RET
ATOF ENDP
FTOA PROC NEAR USES EBX ECX EDX
; from The Intel Microprocessors (8th Edition)
; it may not work in corner cases
FINIT
MOV ECX, 0
FSTCW TEMP
MOV AX, TEMP
PUSH AX
OR AX, 0C00H
MOV TEMP, AX
FLDCW TEMP
FLD NUMB
FTST
FSTSW AX
AND AX, 4500H
.IF AX == 100H
MOV STRING[ECX], '-'
INC ECX
FABS
.ENDIF
FRNDINT
FIST WHOLE
FLD NUMB
FABS
FSUBR
FSTP FRACT
MOV EAX, WHOLE
MOV EBX, 10
PUSH EBX
.REPEAT
MOV EDX, 0
DIV EBX
ADD DL, 30H
PUSH EDX
.UNTIL EAX == 0
POP EDX
.WHILE EDX != 10
POP EBX
MOV STRING[ECX], DL
INC ECX
MOV EDX, EBX
.ENDW
MOV STRING[ECX], '.'
INC ECX
POP TEMP
FLDCW TEMP
FLD FRACT
.REPEAT
; INC EDX
FMUL TEN
FIST TEMP
MOV AX, TEMP
ADD AL, 30H
CALL ISDIGIT
CMP BL, 1
JNE FTOA_RET
MOV STRING[ECX], AL
INC ECX
FISUB TEMP
FXAM
FSTSW AX
SAHF
.UNTIL ZERO?
FTOA_RET:
MOV STRING[ECX], '$'
RET
FTOA ENDP
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment