Created
February 9, 2020 09:49
-
-
Save taoky/b40a1e71020f6c6884dc1b0351735e53 to your computer and use it in GitHub Desktop.
FTOA and ATOF procedure assembly for 80387
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.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