
ayuda programa ensamblad orardenar arreglo(burbuja)
Publicado por jean (1 intervención) el 08/05/2017 20:35:18
hola, quisiera saber como reparar mi programa para que ordene con el metodo de burbuja, estoy usando EMU8086
lo quise hacer de la forma simple, 2 ciclos i,j con una desicion que intercambie, el problema esta en el modulo de ordenamiento
lo quise hacer de la forma simple, 2 ciclos i,j con una desicion que intercambie, el problema esta en el modulo de ordenamiento
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
TITLE SUMA_ASCII_BIN programa que suma 2 números
.MODEL SMALL
;--------------------------------------------------------------------
.STACK 64
;--------------------------------------------------------------------
.DATA
; DEFINICION DE DATOS
MENS1 DB 'Proporcione N: $'
MENS2 DB 'Proporcione elemento: $'
MENS3 DB 'Arreglo = $'
N DB 0
I DB 0
COMPA DB 0
BAND DB 0
ARREGLO DB 20 DUP 0
;---------------------------------------------------------------------
.CODE
; Programa Principal
MAIN PROC FAR
MOV AX,@data ; INICIALIZA APUNTADOR AL AREA DE DATOS
MOV DS,AX
LEA DX,MENS1 ; SE APUNTA AL PRIMER MENSAJE
CALL ESC_CAD ; SE ESCRIBE
CALL EMPAQUETA ; SE LEE
MOV N,AL ; SE GUARDA EN LA VARIABLE N
CALL ALI_LIN ; SE ESCRIBE UN ALIMENTO DE LINEA
CALL LEAARR ; SE LLAMA A LA FUNCION QUE LEE EL ARREGLO
CALL ORDARR ; SE LLAMA A LA FUNCION QUE ORDENA
CALL IMPARR ; SE LLAMA A LA FUNCION QUE IMPRIME
RET
MAIN ENDP
LEAARR PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV CL,N
MOV CH,0
CICLO:
CMP CH,CL
JGE TER_LEC
CALL ALI_LIN ; SE INCREMENTA LINEA
LEA DX,MENS2 ; SE APUNTA MENSAJE "ELEMENTO"
CALL ESC_CAD ; SE ESCRIBE EL MENSAJE
CALL LEE ; SE LEE
MOV ARREGLO[SI],AL
INC SI
INC CH
CALL ALI_LIN ; SE INCREMENTA LINEA
JMP CICLO
TER_LEC:
POP SI
POP AX
POP BX
POP CX
POP DX
RET
LEAARR ENDP
ORDARR PROC NEAR
PUSH CX
PUSH SI
PUSH AX
MOV CL,0
MOV CH,0
MOV AL,N
CICLO_OR2:
CMP CL,AL
JGE FIN_OR
CICLO_OR1:
CMP CH,AL
JGE SALTO_OR2
CMP SI,[SI+1]
JLE FIN_DESICION
XCHG SI,[SI+1]
FIN_DESICION:
INC CH
INC SI
JMP CICLO_OR1
SALTO_OR2:
INC CL
JMP CICLO_OR2
FIN_OR:
POP CX
POP SI
POP AX
RET
ORDARR ENDP
IMPARR PROC NEAR
PUSH AX
PUSH BX
PUSH CX
MOV CL,N
MOV CH,0
CICLOIMP:
CMP CH,CL
JGE TER_IMP
CALL ALI_LIN ; SE INCREMENTA LINEA
CALL ESC_VEC
INC CH
JMP CICLOIMP
TER_IMP:
POP AX
POP BX
POP CX
RET
IMPARR ENDP
;RUTINAS
ESC_VEC PROC NEAR ;SUBPROGRAMA QUE ESCRIBE 1 ELEMENTO DE 1 VECTOR
MOV DL,ARREGLO[SI]
CALL ESC
INC SI
RET
ESC_VEC ENDP
ESC_CAD PROC NEAR ;SUBPROGRAMA QUE ESCRIBE CADENA APUNTADA POR DX
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,09H
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
ESC_CAD ENDP
EMPAQUETA PROC NEAR ;SUBPROGRAMA QUE LEE DOS DIGITOS Y LOS EMPAQUETA
PUSH CX ;PARA DEVOLVERV UN NUMERO DE DOS DIGITOS EN AL
CALL LEE
CALL ASCII_BIN
MOV CH,AL
MOV CL,4
SHL CH,CL
CALL LEE
CALL ASCII_BIN
ADD AL,CH
POP CX
RET
EMPAQUETA ENDP
ASCII_BIN PROC NEAR ; SUBPROGRAMA QUE ESCRIBE A PANTALLA UN
CMP AL,'0' ; NÚMERO DE DOS DIGITOS HEXADECIMALES
JL ERROR
CMP AL,'9'
JG SIGUE
SUB AL,30H
JMP FIN
SIGUE: CMP AL,'A'
JL ERROR
CMP AL,'F'
JG SIGUE1
SUB AL,37H
JMP FIN
SIGUE1: CMP AL,'a'
JL ERROR
CMP AL,'f'
JG ERROR
SUB AL,57H
JMP FIN
ERROR: MOV AL,0
FIN: RET
ASCII_BIN ENDP
LEE PROC NEAR ; RUTINA QUE LEE UN CARACTER DE TECLADO
PUSH BX ; Y LO DEJA EN AL
PUSH CX
PUSH DX
MOV AH,01H
INT 21H
POP DX
POP CX
POP BX
RET
LEE ENDP
DESEMPAQUETA PROC NEAR ; RUTINA QUE LEE DOS CARACTERES Y LOS GUARDA
PUSH CX ; JUNTOS EN UN SOLO BYTE
PUSH DX
MOV DH,DL ;PARA NO PERDERLO
MOV CL,4
SHR DL,CL
CALL BIN_ASCII
CALL ESC
MOV DL,DH
AND DL,0FH
CALL BIN_ASCII
CALL ESC
POP DX
POP CX
RET
DESEMPAQUETA ENDP
BIN_ASCII PROC NEAR; RUTINA QUE CONVIERTE DE BINARIO A ASCII
CMP DL,9 ; SUMANDO 30H SI ES NUMERO Y 37H
JL SUMA30H ; SI ES CARACTER
ADD DL,37H
JMP FIN2
SUMA30H:ADD DL,30H
FIN2: RET
BIN_ASCII ENDP
ESC PROC NEAR ; RUTINA QUE ESCRIBE A PANTALLA EL CARACTER
PUSH AX ; CONTENIDO EN DL
PUSH BX
PUSH CX
PUSH DX
MOV AH,02H
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
ESC ENDP
ALI_LIN PROC NEAR
PUSH DX
MOV DL,0AH ; ALIMENTO DE LINEA
CALL ESC
MOV DL,0DH ; CONTROL DE CARRO
CALL ESC
POP DX
RET
ALI_LIN ENDP
END MAIN
Valora esta pregunta


0