Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Programming > Assembly x86 > Display numbers...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 1 of 5 Topic 4519 of 4826
Post > Topic >>

Display numbers in IEEE format

by mahesh_chavan <spamtrap@[EMAIL PROTECTED] > Feb 8, 2008 at 05:39 AM

Dear Sir,
I have got  source code to get and display floats and double numbers
in IEEE formats from one book. I just don't remember the author.
I have modified the source to accept the number from user.
When I run this program, the number is correcly converted to IEEE
format. I have stored it in a file and all the programs (Qbasic, Turbo
C etc.) are able to show the correct value. But my program shows
additional digits. Can anybody help me so, that this program will
display the exact number ?
e.g. when I type           567.81
the number displayed is 567.80997
Similarly the program to display double numbers show
12345678.90
as					    12345678.89999997615814208984375
I am giving here source for my GetFloat.asm :

..MODEL TINY
..386
..387
..DATA			; program works correct for input of float
SCREENWIDTH DB 80
NUMSTR DB 18 DUP (0)	; but displays more fraction in output
SIGN DB 0
TEMP1 DW ?
TEN DD 10.0
NUMB DD ?
TEMP DW 0
WHOLE DD ?
FRACT DD ?
startcol dw 0
lastcol dw 0
fil db 'float.dat',0
..CODE
..STARTUP
MOV AX, CS
MOV DS, AX
MOV ES, AX
CALL CLEA
MOV SI, OFFSET NUMSTR
MOV CX, 16		; MAX. 6 CHARS
MOV DH, 05		; ROW 5
MOV DL, 10		; COL 10
CALL GETSTRVM
MOV SI, OFFSET NUMSTR
CALL CONVTOFL
CALL SENDCRLF
CALL DISPFLOAT
call writfloat
..EXIT

CONVTOFL PROC NEAR
PUSHA				; SI : STRING CONTAINING NUM
FLDZ
MOV AL, BYTE PTR [SI]		; CLEAR ST
CMP AL, '-'
JZ NUMNEG
CMP AL, '+'
JNZ NOPOS
INC SI		; GO TO ACTUAL NUM
NOPOS:
MOV SIGN, 0
JMP STNUM
NUMNEG:
mov di, offset SIGN
MOV AL, '-'
MOV BYTE PTR [DI], AL
INC SI		; GO TO ACTUAL NUM
MOV CX, 17		; MAX 17 DIGITS + 1 SIGN
STNUM:
MOV AL, BYTE PTR [SI]
CMP AL, '0'
JB INTOVER
CMP AL, '9'
JA INTOVER
FMUL TEN
MOV AH, 0
SUB AL, 30H		; CONVERT FROM ASCII
MOV TEMP1, AX
FIADD TEMP1
INC SI
LOOP STNUM
JMP BUFUL
INTOVER:
CMP AL, '.'
JNZ BUFUL
INC SI		; START GETTING FRACTION PART
FLD1
FRACLOOP:
MOV AL, BYTE PTR [SI]
CMP AL, '0'
JB FRDONE
CMP AL, '9'
JA FRDONE
FDIV TEN
MOV AH, 0
SUB AL, 30H
MOV TEMP1, AX
FILD TEMP1
FMUL ST, ST(1)
FADD ST(2), ST
FCOMP
INC SI
JMP FRACLOOP
FRDONE:
FCOMP		; CLEAR STACK
BUFUL:
MOV SI, OFFSET SIGN
MOV AL, BYTE PTR [SI]
CMP AL, '-'
JNZ NONEG
FCHS		; MAKE NEGATIVE
NONEG:
FSTP NUMB
POPA
RET
CONVTOFL ENDP

DISPFLOAT PROC NEAR		; NUMB CONTAINS NUMBER TO DISPLAY
PUSHA
FSTCW TEMP	; SAVE CURRENT CONTROL WORD
OR TEMP, 0C00H	; SET ROUNDING TO CHOP
FLDCW TEMP
FLD NUMB	; GET NUMB
FTST		; TEST NUMB
FSTSW AX		; STATUS TO AX
AND AX, 4500H	; GET C3, C2 AND C0
CMP AX, 0100H		; TEST FOR NEGATIVE NUMBER
JNZ NOT100
MOV AL, '-'
CALL DISPCHAR
FABS
NOT100:
FLD ST
FRNDINT		; GET INTEGER PART
FIST WHOLE
FSUBR
FABS
FSTP FRACT	; SAVE FRACTION
MOV EAX, WHOLE
MOV EBX, 10
MOV CX, 0
PUSH BX
SHWHOLE:
MOV EDX, 0
DIV EBX
ADD DL, 30H
PUSH DX
CMP EAX, 0
JZ WHDONE
JMP SHWHOLE
WHDONE:
POP DX
CMP DX, BX
JZ DONEDON
MOV AL, DL
CALL DISPCHAR
INC CX
JMP WHDONE
DONEDON:
MOV AL, '.'
CALL DISPCHAR
MOV EAX, FRACT
FSTCW TEMP		; SAVE CURRENT CONTROL WORD
XOR TEMP, 0C00H		; SET ROUNDING TO NEAREST
FLDCW TEMP
FLD FRACT
FXTRACT
FSTP FRACT
FABS
FISTP WHOLE
MOV ECX, WHOLE
MOV EAX, FRACT
SHL EAX, 9
RCR EAX, CL
DSPFR:
MUL EBX
PUSH EAX
XCHG EAX, EDX
ADD AL, 30H
CALL DISPCHAR
INC CX
CMP CX, 7
JZ T0
POP EAX
CMP EAX, 0
JNZ DSPFR
T0:
POPA
RET
DISPFLOAT ENDP

GETSTRVM PROC NEAR
PUSH AX				; INPUT CX : NO. OF CHARS TO BE INPUTTED
PUSH BX				; DH : START ROW, DL : START COL
    			; SI : BUFFER ADDRESS TO PUT INPUT
PUSH DX
PUSH DI
PUSH ES
PUSH CX
PUSH SI
mov ax, 0B800h			; video buffer
mov es, ax
xor ax, ax
mov al, dh			; start. row
PUSH DX
MOV BX, OFFSET SCREENWIDTH
MOV AL, BYTE PTR [BX]
XOR BH, BH
mov BL, AL                      ; SCREEN WIDTH * 2 TO ACCOMDATE HIGHER
RES. VGA TEXT MODES
SHL BX, 1
MOV AL, DH                      ; START ROW
mul bx
POP DX
PUSH DX
XOR DH, DH			; ZERO OUT ROW
add ax, DX			;  start. col. no.
ADD AX, DX			; TWICE COL. NO.
POP DX
mov di, ax
PUSH DX
PUSH DI
mov si, offset startcol
mov  [si], di
push cx
add cx, cx			; di will be double
add di, cx
dec di
dec di
mov si, offset lastcol
mov [si], di
pop cx
POP DI				; RESTORE START. DI
POP DX
pop si				; restore si
push si
PUSH DX
PUSH DI
mov dl, 01001111b		; no blinking intense white on red background
ini:
mov bl, byte ptr ds:[si]
mov byte ptr es:[di], bl		; put space
inc di
inc si
mov byte ptr es:[di], dl		; put attribute
inc di
loop ini
POP DI
POP DX					; RESTORE START. CPUROR POS
PUSH DI
getkey:
call LOCATE
xor ax, ax
int 16h
cmp al, 13
jz PUTBUFF
cmp al, 8			; back space
jz backspace
cmp ah,75
jz cur_lt
cmp ah, 77
jz cur_rt
cmp ah, 83
jz del
mov byte ptr es:[di], al		; show char
cmp di, lastcol
jz maxchar
inc dl
inc di
inc di
jmp getkey
maxchar:
jmp getkey
cur_lt:
cmp di, startcol
jz nolt
dec di
dec di
dec dl
jmp getkey
nolt:
jmp getkey
cur_rt:
cmp di, lastcol
jz nort
inc dl
inc di
inc di
jmp getkey
nort:
jmp getkey
del:
push di
movemem:
mov si, di
inc di
inc di
mov bl, byte ptr es:[di]
mov byte ptr es:[si], bl
cmp di, lastcol
jb movemem
mov byte ptr es:[di], ' '
pop di
jmp getkey
backspace:
push di
mov si, di
dec si
dec si			; prev. char
movememb:
mov bl, byte ptr es:[di]
mov byte ptr es:[si], bl
cmp di, lastcol
jz doneback
mov si, di
inc di
inc di
jmp movememb
doneback:
mov byte ptr es:[di], ' '
pop di
jmp cur_lt  ; cursor left after backspace
PUTBUFF:
; ******** restore normal text attribute when editing is done
mov dl, 00000111b               ; no blinking  white on black
background
mov di, startcol
restattrib:
inc di
mov byte ptr es:[di], dl		; put attribute
inc di
loop restattrib
; *****

POP DI
POP SI			; ADDRESS OF BUFFER RESTORED
POP CX			; NO. OF CHARS RESTORED
getch:
mov bl, byte ptr es:[di]
mov byte ptr [si], bl
inc si
inc di
inc di
loop getch
POP ES
POP DI
POP DX
POP BX
POP AX
RET
GETSTRVM ENDP

LOCATE PROC NEAR
PUSH AX
PUSH SP
PUSH BP
PUSH SI
PUSH DI
MOV AH,0FH			; GET CURRENT VIDEO STATUS
INT 10H
MOV AH,02H			; LOCATE CURSOR, DH : ROW, DL : COL
INT 10H
POP DI
POP SI
POP BP
POP SP
POP AX
RET
LOCATE ENDP

DISPCHAR PROC NEAR	; CHAR IN AL
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV AH, 0EH	; WRITE TELETYPE
INT 10H
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
DISPCHAR ENDP

SENDCRLF PROC NEAR
PUSH AX
PUSH BX
PUSH SI
PUSH CX
PUSH DX
PUSH DI
XOR BX, BX
MOV AH,0EH
MOV AL, 0DH
INT 10H
MOV AL, 0AH
INT 10H
POP DI
POP DX
POP CX
POP SI
POP BX
POP AX
RET
SENDCRLF ENDP

CLEA PROC NEAR
PUSH AX
PUSH SP
PUSH BP
PUSH SI
PUSH DI
MOV AH,0FH			; GET CURRENT VIDEO STATUS
INT 10H
MOV AH,00H			; SET VIDEO MODE
INT 10H
POP DI
POP SI
POP BP
POP SP
POP AX
ret
CLEA ENDP

writfloat proc near
mov ah, 3ch     ; create a file
xor cx, cx              ; normal attribute
mov dx, offset fil      ; file name
int 21H                 ; create file
mov bx, ax              ; store file handle in bx
mov ah, 40h             ; write to file
mov cx, 4               ; write 4 bytes
mov dx, offset numb     ; write buffer
int 21h
mov ah, 3eh
int 21h                 ; close file
ret
writfloat endp

END

Please tell me where is the bug and is there any other way to display
these numbers ? ( without maths co-processor )
-Mahesh Shrikrishna Chavan
 




 5 Posts in Topic:
Display numbers in IEEE format
mahesh_chavan <spamtr  2008-02-08 05:39:14 
Re: Display numbers in IEEE format
"Wolfgang Kern"  2008-02-08 22:44:24 
Re: Display numbers in IEEE format
Tim Roberts <spamtrap  2008-02-10 00:01:58 
Re: Display numbers in IEEE format
"Rod Pemberton"  2008-02-09 19:41:47 
Re: Display numbers in IEEE format
Spoon <root@[EMAIL PRO  2008-02-11 19:31:32 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Wed Oct 15 22:24:44 CDT 2008.