
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:
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


0