Buenas tardes, quisiera ver quien me podría ayudar con este problema:
Quiero poder guardar el valor mas chico ingresado y el valor mas grande para seguir con mi proyecto pero nose como puedo imprimir una posición de mi arreglo y ademas guardarlo en una variable para seguir con su uso. Ayuda por favor el problema esta en las etiquetas de "Menor" y "Mayor".
Este es mi codigo:
;Macro que nos permite Imprimir
IMPRIME MACRO ARG1
PUSH AX
PUSH DX
LEA DX, ARG1
MOV AH, 9
INT 21H
POP DX
POP AX
ENDM
data segment
MENU DB '**** MENU ****',13,10
DB '1=Multiplicar',13,10
DB '2=Dividir',13,10
DB '3=Salir',13,10
DB 'Elija una opcion',13,10,'$'
Mensaje1 DB 'Introduzca los 10 valores desde 0 a 99',13,10,'$'
Mensaje2 DB 'Los numeros ordenados son:' ,13,10,'$'
Mensaje3 DB 'El numero mayor es:',13,10,'$'
Mensaje4 DB 'El numero menor es:',13,10,'$'
Mensaje5 DB 'EL resultado es:',13,10
DB 'Decimal-Binario',13,10,'$'
MensajeError DB 13,10,'SE ESPERABA UN NUMERO DEL 0 AL 9, CONTINUE DESDE EL ULTIMO DIGITO INGRESADO: ',13,10,'$'
MensajeEnter DB 13,10,'PRESIONA ENTER PARA REGRESAR: $'
MensajeMenu DB 13,10,'OPCION NO VALIDA, ELIJE SEGUN EL MENU ',13,10,'$'
LINEA DB 13,10,'$'
salto db '$'
ARRAY DB 10 dup(0)
ends
;aqui se declara la pila esto lo hace el emu8086 por default
stack segment
dw 128 dup(0)
ends
;declaracion del segmento de codigo, despues de esta declaracion viene el codigo q necesitara el programa
code segment
ASSUME CS:CODE, DS :DATA, SS:STACK, ES:DATA
inicio: ;en esta etiqueta lo unico que haremos sera desplegar el menu
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(ds)
mov es, ax ;pasamos lo que hay en el registro ax al segmento extra(es)
call limpiar
;esta etiqueta se encarga de meter datos, cuando el usuario mete un 1 el programa salta a esta parte
meter_datos:
call limpiar ;mandamos a llamar a la etiqueta limpiar
lea dx, Mensaje1 ;aqui pasamos el contenido de la variable pkey al registro dx
mov ah, 9 ;puesto que el servicio 9 de la interrupcion 21h requiere que lo que
int 21h ;se va a desplegar en pantalla este en el registro dx por esa razon es que pkey se envia a dx
mov si,0 ;aqui ponemos el indice de nuestro arreglo en 0
;la etiqueta validacion se encargara de que metamos solo numeros de lo contrario mandara un mensaje de error
validacion:
mov ah,1 ;utilizamos nuevamente el servicio 1 de la
int 21h ;interrucpion 21h para meter los datos
;como necesitamos mover el contenido de al a cx, pero cx es de 16 bits y al de 8 bits
mov cx,ax ;entonces agarramos a ax, y asi mlo movemos a cx
cmp al, 30h ;comparamos lo que metimos con 0
jb error ;si es menor que 0 entonces enviamos um mensaje de error
cmp al, 39h ; comparamos lo que metimos con 9
ja error ; si es mayor que 9 entonces enviamos un mensaje de error
mov array[si],cl ;pasamos lo que metimos a nuestro arreglo
lea dx, salto ;aqui pasamos el contenido de la variable parche al registro dx
mov ah, 9 ;puesto que el servicio 9 de la interrupcion 21h requiere que lo que
int 21h ;esto nos servira para dar espacio entre cada numero que metamos
add si, 1 ;incrementamos nuestro indice en uno para que nos movamos en el arreglo
;si[[0][0+1=1][1+1=2][2+1=3][3+1=4][4+1=5][5+1=6][6+1=7][7+1=8][8+1=9][9+1=10]]
cmp si,0ah ;comparamos si nuestro indice(SI) ya llego a 10
jb validacion ;si todavia no ha llegado a 10, osea si es menor que salte a validacion
;y segumios metiendo numeros hasta que se completen los 10
mov si,0 ;ponemos nuestro indice en la posicion cero
call limpiar ;mandamos a la etiqueta limpiar
;esta parte se encarga de ordenar el arreglo
ordena:
mov si,0 ;poenmos nuestro indice a cero
mov cx,9 ;y en el registro cx ponemos 9 que nos servira para el primer ciclo loop
cicloi:
push cx ;guardamos el valor que pusimos en cx en la pila
mov cx,9 ;luego volvemos a poner 9 en cx lo que nos servira para el segundo ciclo loop
mov si, offset array ;ponemos los valores que estan guardados en nuestro arreglo en si
mov di,si ;luego pasamos si a di
cicloj:
inc di ;incrementamos en uno a di, es decir, di=di+1
mov al,[si] ;luego lo que esta es si lo pasamos a al registro al
cmp al,[di] ;luego hacemos la comparacion
ja intercambio ;si el numero que hay en al es mayor que el que hay di saltamos a la etiqueta intercambio
jmp imasi ;de lo contrario saltamos a imasi
intercambio: ;aqui hacemos el intercambio de valores
mov ah,[di] ;lo que hay en di lo pasamos a ah(ah funicona como una variable auxiliar)
mov [di],al ;luego lo que hay en al se pasa a di
mov [si],ah ;y lo que hay en ah lo pasamos a si
imasi: ;en esta etiqueta solo incrementamos a si en uno es decir si=si +1
inc si
loop cicloj ;el segundo ciclo se repite hasta que cx llega a cero
pop cx ;aqui sacamos el valor que guardamos en el registro cx
loop cicloi ;el ciclo se repite hasta que el cx del primer ciclo llega a cero
;es decir el cs que almacenamos en la pila
mov si,0 ;volvemos a poner nuestro indice a cero
call limpiar ;saltamos a la etiqueta start
;esta etiqueta se encargara de imprimir el arreglo
imprimir_array:
call limpiar ;mandamos a llamr a la etiqueta limpiar
;en esta parte se hara un salto de linea
mov dx, offset linea
mov ah, 9
int 21h
mov dx, offset mensaje2
mov ah, 9
int 21h
lea dx, array[si] ;aqui imprimos el arreglo
mov ah, 9 ;como es el servicio 9 pasamos array al registro dx
int 21h
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
menor:
mov bh,0
mov bl,1
imprime linea
imprime mensaje3
lea dx, array[bx] ;aqui imprimos el arreglo
mov ah,9
int 21h
mayor:
mov bx,9
imprime linea
imprime mensaje4
lea dx, array[bx] ;aqui imprimos el arreglo
mov ah,9
int 21h
JMP SALIR ;luego saltamos a la etiquta start
;desplegamos un mensaje de error para indicar de que no introdujo un numero
error:
IMPRIME MensajeError ;pasamos el contenido de la variable msjerror
jmp validacion ;aqui saltamos a la etiqueta validacion
;esta etiqueta nos servira para limpiar pantalla
limpiar:
mov ah,00h ;usamos el servico 00h de la interrupcion 10h
mov al,03h ;para limpiar la pantalla
int 10h
ret
;aqui salimos del programa
salir:
mov ax, 4c00h ;utilizamos el servicio 4c de la interrupcion 21h
int 21h ;para termianr el programa
ends
end inicio