TITLE Square Root (EX44.ASM)
PAGE ,132
OUR_CODE SEGMENT PARA 'CODE'
PUBLIC SQRT32
SQRT32 PROC FAR
ASSUME CS:OUR_CODE
PUSH BP ;Save contents of BP
PUSH DX ; and source number DX:AX
PUSH AX
MOV BP,SP ;BP points to AX on the stack
MOV BX,200 ;As a first approx,
DIV BX ; divide source number by 200,
ADD AX,2 ; then add 2
NXT_APP: MOV BX,AX ;Save this approx. in BX
MOV AX,[BP] ;Read source number again
MOV DX,[BP+2]
DIV BX ;Divide by last approx.
ADD AX,BX ;Average last two approxs.
SHR AX,1
CMP AX,BX ;Last two approxs. identical?
JE DONE
SUB BX,AX ; No. Check for diff. of 1
CMP BX,1
JE DONE
CMP BX,-1
JNE NXT_APP
DONE: MOV BX,AX ;Put result in BX
POP AX ;Restore source number
POP DX
POP BP ; and scratch register BP
RET
SQRT32 ENDP
OUR_CODE ENDS
END SQRT32