; Calcular la raíz cuadrada de un número de 32 bits ubicado
; en la dirección efectiva(offset) 0x300, poniendo el
; resultado de 16 bits en la dirección efectiva 0x304.
; Restar 1, 3, 5, 7, etc. al radicando hasta que el número
; dé negativo. La cantidad de restas menos uno es la raíz
; cuadrada.
; Compilar: nasm -f bin sqrt.asm -o sqrt.bin -l sqrt.lst
RADICANDO EQU 0x300    ; Definicion de constantes
RAIZ      EQU 0x304
USE16

Inicio:
    mov ax,0           ; Inicializar puntero de pila
    mov ss,ax          ; SS:SP.
    mov ds,ax          ; Inicializar segmento de datos.
    mov sp,0x8000
    mov eax,76         ; Hallar la raíz cuadrada
    mov [RADICANDO],eax ; de 76.
    call raiz_cuadrada ; Ejecutar la raíz cuadrada.
colgarse:
    jmp colgarse
raiz_cuadrada:
    mov eax,[RADICANDO]
    xor ecx,ecx
    inc ecx         ; Poner sustraendo a 1.
    mov dx,0        ; Poner raíz a cero.
ciclo_raiz:
    sub eax,ecx     ; Realizar la resta.
    jc raiz_hallada ; Saltar si es negativo.
    add ecx,2       ; Siguiente sustraendo impar.
    inc dx          ; Siguiente resultado.
    jmp ciclo_raiz  ; Continuar restando.
raiz_hallada:
    mov [RAIZ],dx   ; Salvar resultado.
    ret             ; Fin de la subrutina.
	                ; Completar con ceros.
	times 0xFFF0-($-Inicio) db 0

Entrada:
	jmp Inicio-$$   ; Esta instrucción debe estar
                    ; en el offset 0xFFF0.	

                    ; Relleno hasta el final de la ROM
	times 16-($-Entrada) db 0
