Ensamblador - Problemas con arreglo en Ensamblador

 
Vista:
sin imagen de perfil

Problemas con arreglo en Ensamblador

Publicado por Fernando (1 intervención) el 23/05/2016 23:59:31
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
;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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder