Sei sulla pagina 1di 7

.

model small
.stack 100h
.data

;Declaracion de variables

tabla_numerica db "Tabla inicial: "


tabla dw
"50","49","27","29","8","15","26","39","27","48","3","8","9","2","1","5","1","2","7
","10","12","4","21","11","32","45","23","12","13","16","3","2","1","5","43","34","
50","4","12","40","21","12","43","4","1","6","47","48","10","35","$" ;976

mensaje2 db 10,13, "Tabla final: "


tabla2 dw 50 dup(0),"$"

suma dw 0
sumatoria dw 0
cont dw 100
valor db 0

parche db "$"
array db 50 dup(0), "$"
salto db 10,13, 10,13, "$"
pkey db "muestre la tabla a ordenar:",10,13

opciones db "opciones: ",10,13

opcion_1 db "1_ordenar la tabla de manera ascendente",10,13


opcion_2 db "2_numeros bcd encontrados",10,13
opcion_3 db "3_promedio total de la tabla",10,13
opcion_4 db "4_Reemplazar el valor por el negado del mismo en la cadena",10,13
opcion_5 db "5_salir",10,13

mesjenter db "inserte un numero para optar por una opcion, o presione enter
para regresar:","$"
msjmenu db "opcion no valida, elije segun el menu:","$"

mensaje4 db "La cantidad de BCD es:","$"


cont_bcd dw 0,"$"

mensajebcd db 10,13,"Tabla de valores BCD: "


t_bcd dw 50 dup(0),"$"

mensaje5 db "El promedio es: ",10,13


cociente dw 0,","
residuo dw 0,"$"

mensaje6 db 10,13,"Inserte numero a buscar: ","$"


mensaje7 db 10,13,"Usted no inserto un numero ","$"
mensaje8 db 10,13,"La cantidad de veces encontrado el numero es: ","$"
cont_e dw 0,"$"
.code
mov ax,@data ;Pasamos lo que hay en el segmento de datos al registro ax
mov ds,ax ;pasamos lo que hay en el registro ax al segmento de datos

;**************************************************************************
; DESPLIEGUE DE OPCIONES
*

;**************************************************************************

mostramos_tabla:
mov dx,offset tabla_numerica
mov ah,09
int 21h
jmp menu

menu:
mov dx,offset opciones ;leemos el contenido de las opciones
mov ah,09 ;estamos en uso del sevicio 09
int 21h ;con esta interrupcion veremos el despliegue en la
pantalla

lee_opciones: ;con esta etiqueta observaremos la opcion que hemos


elegido
mov ah,01 ;haremos uso del servicio 1
int 21h ;de la interrupcion 21h esta guardara la tecla que
presionamos
cmp al,31h ;aqui comparamos la tecla que introducimos con 1
jb error_menu ;si el numero introducido es menor que 1 nos enviara
a la etiqueta erro_menu
je ordenamiento_tabla ;si el numero introducido es igual a 1 nos llevara a
la primera opcion
cmp al,32h ;comparamos lo que hay en al (el numero insertado)
con 2
je numeros_BCD_encontrados ;si el numero insertado es igual a 2 nos llevara a
la segunda opcion
cmp al,33h ;comparamos lo que hay en al (el numero incertado)
con 3
je promedio_total ;si el numero insertado es igual a 3 nos llevara a
la tercera opcion
cmp al,34h ;comparamos lo que hay en al (el numero insertado)
con 4
je reemplazo_por_negado ;si el numero insertado es igual a 4 nos llevara a
la cuarta opcion
cmp al,35h ;comparamos lo que hay en al (el numero insertado)
con 5
ja error_menu ;si el numero que insertamos es mayor a 5 nos
enviara a la etiqueta error
je salir ;si el numero insertado es 5 nos enviara a la
etiqueta salir

;**************************************************************************
; ORDENAMIENTO DE TABLA
*

;**************************************************************************

;Esta etiqueta contiene la rutina para ordenar la tana de manera ascendente y


descendente por el metodo de la burbuja

ordenamiento_tabla:
call limpiar
lea dx,tabla ;pasamos el contenido de la variable pkey al
registo dx
mov ah,09
int 21h
mov si,0 ;colocamnos el indice del arreglo en cero
mov ah,01 ;utilizamos el servicio 1 para colocar datos
mov cx,ax
mov array[si],cl ;pasamos el contenido al arreglo
lea dx,parche ;pasamos el contenido de parche al registo dx
mov ah,09
int 21h
add si,01 ;incrementamos el indice en 1 para movernos en el
arreglo
call limpiar ; mandamos a la etiqueta limpiar
jmp menu ;esta etiqueta imprime el arreglo

imprimir_array:
call limpiar
mov dx, offset salto
mov ah,09
int 21h
lea dx,array[si] ;imprimimos el arreglo
mov ah,09
int 21h
mov dx, offset mesjenter ;desplegamos el mensaje contenido en la variable
mesjenter
mov ah,09
int 21h

ir_menu:
mov ah,01 ;pedimos un enter para regresar
int 21h
cmp al,0Dh ;comparamos lo que insertamos con 0dh
jb ir_menu ; si es menor volvemos a ir_menu y pedimos un nuevo
enter
ja ir_menu ;si es mayor volvemos a ir_menu y pedimos un nuevo
enter
call limpiar
jmp menu

ordena:
mov si,0
mov cx,09
cicloi:

push cx ;guardamos el valor de cx en la pila


mov cx,09
mov si,offset array ;ponemos los valores guradados en nuestro arreglo
en si
mov di,si ;ponemos los valores de si en el registro di

cicloj:
inc di ;incrementamos en 1 a di di=di+1
mov al,[si] ;el contenido de si lo pasamos al registro al
cmp al,[di]
ja intercambio; ;si el numero que hay es mayor en al es mayor que
el que hay di saltamos a intercambio
jmp imasi ;si no saltamos a imai

intercambio: ;aqui hacemos el intercambio de valores


mov ah,[di] ;pasamos el contenido de di a ah
mov [di],al
mov [si],ah

imasi: ;aqui incrementamos a si en uno si=si+1


inc si
loop cicloj ;el segundo ciclo se repite hasta que cx llegue a
cero
pop cx ;sacamos el valor guardado en el registro cx
loop cicloi ;el ciclo se repite hasta que cx del primer ciclo
llegue a cero
mov si,0 ;colocamos el indice en 0
call limpiar
jmp menu ;saltamos a la etiqueta menu

error_menu:
call limpiar
mov dx, offset msjmenu
mov ah,09
int 21h
jmp menu

limpiar:
mov ah,00h
mov al,03h
int 10h
ret

;**************************************************************************
; NUMEROS BCB
*

;**************************************************************************

numeros_bcd_encontrados:
mov ax,@data
mov ds,ax
mov es,ax
mov cx,cont
lea si,tabla
lea di,t_bcd
cld

lazo3:
mov ax,[si]
cmp ax,0
jae es_mayor_cero
jmp sigo3

es_mayor_cero:

cmp ax,9
jle es_menor_nueve
jmp sigo3

es_menor_nueve:

inc cont_bcd
movsw
dec si
dec si

sigo3:

inc si
inc si
dec cx
loop lazo3
;si se desea ver el resultado en ascii suma 30h a cont_bcd

mov dx,offset mensaje4


mov ah,09h
int 21h

mov dx,offset mensajebcd


int 21h

jmp salir

;**************************************************************************
; PROMEDIO DE LA TABLA
*

;**************************************************************************

promedio_total:

mov ax,@data
mov ds,ax
mov cx,cont

lea si,tabla
cld

lazo:
mov ax,[si]
add suma,ax
inc sumatoria

inc si
inc si
dec cx
loop lazo

mov ax,suma
mov cx,sumatoria
cwd
div cx

mov cociente,ax
mov residuo, dx

mov dx,offset mensaje5


mov ah,09h
int 21h

jmp salir

;**************************************************************************
; Reemplazar el valor por el negado del mismo en la cadena
*

;**************************************************************************

reemplazo_por_negado:
mov dx, offset mensaje6
mov ah,09
int 21h

mov ah,01
int 21h

cmp al,30h
jb noesN

cmp al,39h
ja noesN
jmp sies

sies:
sub al,30h
mov valor,al
jmp selecciono_r

noesN:

mov dx,offset mensaje7


mov ah,09
int 21h
jmp salir

selecciono_r:
mov ax,@data
mov ds,ax

lea si,tabla

rutina:

mov al,valor
cmp [si],al
je aumento_contador

continuoE:

inc si
inc si
dec cont
dec cont
cmp cont,0
je final_E
jmp rutina

aumento_contador:

inc cont_e
mov bx,[si]
neg bx
mov [si],bx
jmp continuoE

final_E:

add cont_e,30h

mov dx,offset mensaje8


mov ah,09
int 21h

jmp salir

salir:
mov ax,4c00h
int 21h

end

Potrebbero piacerti anche