home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
asm_kit
/
asc_bin.asm
< prev
next >
Wrap
Assembly Source File
|
1983-09-16
|
4KB
|
121 lines
;asc-bin.asm
;converts a string of numbers to a signed 16 bit number
STACK SEGMENT PARA STACK 'STACK'
DB 64 DUP('STACK ')
STACK ENDS
CODE SEGMENT PARA 'CODE'
ASCII_BIN PROC FAR
ASSUME CS:CODE,SS:STACK
PUBLIC ASCII_BIN
PUSH BX ;SAVE BX AND CX
PUSH CX
SUB AX,AX ;TO START, RESULT = 0
SUB DX,DX ; DECIMAL COUNT = 0
MOV DI,0FFH ; ASSUME NO BAD CHARACTERS
CMP CX,7 ;STRING TOO LONG?
JA NO_GOOD ;IF SO, GO SET CF AND EXIT
BLANKS:
CMP BYTE PTR [BX],' ' ;SCAN PAST LEADING BLANKS
JNE CHK_NEG
INC BX
LOOP BLANKS
CHK_NEG:
CMP BYTE PTR [BX],'-' ;NEGATIVE NUMBER?
JNE CHK_POS
INC BX ;IF SO INCREMENT POINTER
DEC CX ; DECREMENT THE COUNT
CALL CONV_AB ; AND CONVERT THE STRING
JC THRU
CMP AX,32768 ;IS THE NUMBER TOO SMALL?
JA NO_GOOD
NEG AX ;NO. COMPLEMENT THE RESULT
JS GOOD
CHK_POS:
CMP BYTE PTR [BX],'+' ;POSITIVE NUMBER?
JNE GO_CONV
INC BX ;IF SO, INCREMENT POINTER
DEC CX ; DECREMENT THE COUNT
GO_CONV:
CALL CONV_AB ; AND CONVERT THE STRING
JC THRU
CMP AX,32767 ;IS THE NUMBER TOO BIG?
JA NO_GOOD
GOOD:
CLC
JNC THRU
NO_GOOD:
STC ;IF SO, SET CARRY FLAG
THRU:
POP CX ;RESTORE REGISTERS
POP BX
RET ;EXIT
ASCII_BIN ENDP
;
; THIS PROCEDURE PERFORMS THE ACTUAL CONVERSION.
;
CONV_AB PROC
PUSH BP ;SAVE SCRATCH REGISTERS
PUSH BX
PUSH SI
MOV BP,BX ;IS THIS NECESSARY ******NOT IN BOOK
CHK_PT:
CMP DX,0 ;DICIMAL POINT ALREADY FOUND?
JNZ RANGE ; IF SO, SKIP FOLLOWING CHECK
CMP BYTE PTR DS:[BP],'.' ;DECIMAL POINT
JNE RANGE
DEC CX ;IF SO DECREMENT COUNT
MOV DX,CX ; AND RECOR IT IN DX
JZ END_CONV ; EXIT IF CX=0
INC BP ; INCREMENT POINTER
RANGE:
CMP BYTE PTR DS:[BP],'0' ;IF THE CHARACTER IS
JB NON_DIG ; NOT A DIGIT
CMP BYTE PTR DS:[BP],'9'
JBE DIGIT
NON_DIG:
MOV DI,BP ;PUT ITS ADDRESS IN DI
STC ;SET THE CARRY FLAG,
JC END_CONV ;AND EXIT
DIGIT:
MOV SI,10 ;THE CHARACTER IS A DIGIT
PUSH DX
MUL SI ; SO MULTIPLY AX BY 10
;NOTE-FIRST TIME THROUGH AX=0
JC END_CONV1 ;EXIT IF RESULT IS TOO BIG ******NOT IN BOOK
POP DX
MOV BL,DS:[BP] ;FETCH ASCII CODE,
AND BX,0FH ; SAVE ONLY HIGH BITS,
ADD AX,BX ; AND UPDATE PARTIAL RESULTS
JC END_CONV ;EXIT IF RESULT IS TOO BIG
INC BP ;OTHERWISE, INCREMENT
LOOP CHK_PT ; BP AND CONTINUE
CLC ;WHEN DONE, CLEAR CARRY FLAG
JMP END_CONV ; ******NOT IN BOOK
END_CONV1: ; *****NOT IN BOOK
POP DX ;TO KEEP STACK RIGHT *****NOT IN BOOK
END_CONV:
POP SI ;RESTORE REGISTERS
POP BX
POP BP
RET ;RETURN TO CALLER
CONV_AB ENDP
CODE ENDS
END