home *** CD-ROM | disk | FTP | other *** search
- ;DEC_ADJ.ASM 9-28-83
- ;
- ;INPUT AX = 16 BIT SIGNED NUMBER
- ; CX = NUMBER OF CHARACTER TO RIGHT OF DECIMAL POINT
- ;THIS PROGRAM MULTIPLIES AX BY 10 AND ADJUSTS CX TO MAKE THE
- ;NUMBER IN AX A MAXIMUN VALUE AND CX A EVEN NUMBER
-
- ;----------------------------------------------------
- ;DATA SEGMENT PARA 'DATA'
- ;SAVE_NUM DW ?
- ;DATA ENDS
- ;----------------------------------------------------
- CODE SEGMENT PARA PUBLIC 'CODE'
-
- DEC_ADJ PROC FAR
- ASSUME CS:CODE
- ; ASSUME DS:DATA
- PUBLIC DEC_ADJ
-
-
- CMP AX,0 ;IF NUMBER IS ZERO JUMP TO END AND EXIT
- JZ DEC_ADJ_EXIT
-
- MOV BX,10 ;GOING TO MULTIPLY AX BY 10 AND INCREMENT
- ; CX BY 1 UNTIL GET A CARRY (AX GOT TOO
- ; LARGE)
- MUL_BY_10:
- MOV SI,AX ;SAVE CURRENT VALUE OF NUMBER IN DI
- IMUL BX
- JC UN_DO_LAST ;LAST MULTIPLY WAS ONE TOO MANY GO UNDO
- INC CX
- JMP MUL_BY_10
-
- UN_DO_LAST: ;SAVE_NUM CONTAINS VALUE BEFORE LAST MULTI
- ; MOV AX,DX ;UNDO LAST MULTIPLY
- ; MOV SAVE_NUM,AX ;SAVE PRESENT VALUE OF NUMBER
-
-
- ;CHECK THAT CX IS EVEN NUMBER
- MOV AX,CX ;PUT IN AX FOR DIVIDE
- CBW
- MOV BL,2 ;GOING TO DO A BYTE DIVIDE
- DIV BL ;AL WILL CONTAIN REMAINDER
- CMP AH,0 ;IF REMAINDER WAS ZERO CX WAS EVEN
- JZ DEC_ADJ_EXIT ;WAS EVEN GO EXIT
- MOV AX,SI ;WAS NOT EVEN PUT NUMBER BACK IN AX
- MOV BX,10 ; AND divide BY 10
- CWD
- IDIV BX
- DEC CX ;ADJUST CX FOR divide
-
- JMP DEC_ADJ_EXIT1
-
-
- DEC_ADJ_EXIT:
- MOV AX,SI
-
- DEC_ADJ_EXIT1:
-
- ;ax has number and cx has number of characters after decimal point
-
- RET ;RETURN TO CALLER
-
- DEC_ADJ ENDP
- CODE ENDS
- END