home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
asm_kit
/
dec_adj.asm
< prev
next >
Wrap
Assembly Source File
|
1983-10-13
|
2KB
|
67 lines
;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