Ensamblador - ayuda programa ensamblad orardenar arreglo(burbuja)

 
Vista:
Imágen de perfil de jean

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


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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder