• Miércoles 12 de Agosto de 2020, 03:16

Autor Tema:  Problemas con arreglo en Ensamblador  (Leído 1569 veces)

FerNev

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problemas con arreglo en Ensamblador
« en: Lunes 23 de Mayo de 2016, 23:35 »
0
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