Anda di halaman 1dari 5

;----------------------------------------------------------

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'

texto db "Una de 33.001 ideas siempre surge, cada vez


que te esfuerzas, a veces la recompensa"
db "es buena, pero en otras no lo es. Hay
112.202 interesados pero solo 200.234 son capaces"
db "de pagarlo, no son ni siquiera el 50%
del total."

d_extra db 7 dup(' ')

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)

; (Aqui se insertan las variables)

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 ;

; (Aqui se insertan las instrucciones ejecutables)


exit0:
;-----------------------------------------------------------
lea dx,d_guard
mov ah,09h
int 21h
;-----------------------------------------------------------
mov ax,4C00h

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

lea di,d_extra ; Eliminamos


el caracter "." para tener solamente
mov ax,di ; el dato
numerico
mov bx,0
mov bl,cnt_aux
dec bx
add ax,bx
mov di,ax
push si
lea si,d_guard+29
;************************************************
mov bx,cnt_si
mov ax,si
sub ax,bx
mov si,ax
mov cx,0
mov cl,cnt_aux
nuevs5:
mov al,[di]
cmp al,2Eh
jne rod1
dec di
nuevs4:
cmp cnt_aux1,0
je nuevs3
dec si
dec cnt_aux1
jmp nuevs4
nuevs3:
mov al,3
mov cnt_aux1,al
loop nuevs5
ret
rod1:
mov [si],al
dec si
dec di
dec cnt_aux1
loop nuevs5
mov al,3
mov cnt_aux1,al

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

Anda mungkin juga menyukai