page 60,132
;----------------------------------------------------------
title PRUEBA 3 LABO 1
;----------------------------------------------------------
; Descripcion del programa:
comment* El siguiente programa solo extrae los datos numericos con formato
###.### de la variable texto y finalmente muestra en pantalla los datos
extraidos (puede detectar un maximo de 5 valores numericos (cantidad modificable))*
; Autor: Acarapi Quispe Rodrigo Ronald
;----------------------------------------------------------
; SEGMENTO DE PILA (STACK SEGMENT)
;----------------------------------------------------------
pila segment para stack 'stack'
dw 32 dup(0)
pila ends
;----------------------------------------------------------
; SEGMENTO DE DATOS (DATA SEGMENT)
;----------------------------------------------------------
datos segment para 'data'
cnt_aux db 0
; Identifica numero de datos introducidos
cnt_pnt db 0
; Identifica cantidad de puntos en dato
cnt_aux1 db 3
; Variable que reserva el espacio de 3
cnt_cmp dw 0
; Variable para detener el programa
cnt_si dw 0
; Variable para guardar el puntero si
d_guard db 30 dup('0'),"$"
; Guarda los datos finales (máximo 5 datos)
datos ends
;----------------------------------------------------------
; SEGMENDO DE CODIGO (CODE SEGMENT)
;----------------------------------------------------------
codigo segment para 'code'
programa proc far
assume ss:pila,cs:codigo,ds:datos,es:datos
push ds
sub ax,ax
push ax
mov ax,datos
mov es,ax
mov ds,ax
lea si,texto
lea di,d_extra ; Dato
extraido
mov ax,di
dec ax
mov cnt_cmp,ax
nuev0:
mov al,[si]
cmp al,30h
jb sal0
cmp al,39h
ja sal0
call evalua
cmp si,cnt_cmp
je exit0
lea di,d_extra ; Dato
extraido
jmp nuev0
sal0:
inc si
cmp si,cnt_cmp
je exit0
jmp nuev0 ;
int 21h
ret
programa endp
;----------------------------------------------------------
; EVALUA DATO (1ra EVALUACION)
;----------------------------------------------------------
evalua proc
nuevs0:
mov [di],al
inc si
inc di
inc cnt_aux
; Identifica cantidad de datos introducidos
mov al,[si]
cmp al,30h
jb sals0
cmp al,39h
ja exits0
jmp nuevs0
sals0:
cmp al,2Eh
jne exits0
jmp nuevs0
exits0:
push di ;
Guardamos el puntero de la introduccion de datos
call rev_pnt ;
Revisa si hay mas de 1 punto
pop di
mov al,0 ;
Reiniciamos contadores
mov cnt_aux,al
mov cnt_pnt,al
ret
evalua endp
;----------------------------------------------------------
; REVISA LA CANTIDAD DE PUNTOS
;----------------------------------------------------------
rev_pnt proc
mov cx,0
mov cl,cnt_aux
lea di,d_extra
nuevs1:
mov al,[di]
cmp al,2Eh
jne sals1
inc cnt_pnt
sals1:
inc di
loop nuevs1
cmp cnt_pnt,1
jne sals2
call guardar_d
; Guardar el dato introducido
sals2:
call borrar_d
; Limpia la varible d_extra
ret
rev_pnt endp
;----------------------------------------------------------
; GUARDA EL DATO FINAL
;----------------------------------------------------------
guardar_d proc
mov ax,6 ;
Aumenta la posicion del puntero donde guarda el dato final
mov bx,cnt_si
add ax,bx
mov cnt_si,ax
pop si
ret
guardar_d endp
;----------------------------------------------------------
; BORRAR AREA DE MEMORIA PASAJERA
;----------------------------------------------------------
borrar_d proc
mov cx,7
lea di,d_extra
mov al,20h
nuevs6:
mov [di],al
inc di
loop nuevs6
ret
borrar_d endp
;----------------------------------------------------------
; (Aqui se insertan las instrucciones adicionales)
;----------------------------------------------------------
codigo ends
;----------------------------------------------------------
end programa