Está en la página 1de 6

;hecho puramente por oliver martinez sedano

datos segment
autor db 10,13,"Manuel Oliver Martinez Sedano 20060032k$"
cad1 db 10,13,"Ingrese 20 nums de 4 cifras:$"
;ordenado db 10,13,"El arreglo ordenado es:$"--->para prueba
pares db 10,13,"Los pares son:$"
impares db 10,13,"Los impares son:$"
selector db 10,13,"Escoja orden ASC(a)-par o DSC(d)-impar:$"
ASC db 10,13,"Pares Ascendentemente:$"
DSC db 10,13,"Impares Descendentemente:$"
carga db 10,13,"cargando espere por favor ...$"

salto db 10,13,"$"
newline db 10,13,"$"

elem dw 0 ;variable 'elemento'
n dw 0 ;numero de elementos total

min dw 0 ;numero minimo

ni dw 0 ;numero de impares
np dw 0 ;numero de pares

t dw 0 ;temporal

Mat dw 30 dup(0) ;arreglo total
MD dw 30 dup(0) ;arreglo ordenado
P dw 30 dup(0) ;arreglo de pares
I dw 30 dup(0) ;arreglo de impares
dos dw 2
datos ends
ImpCad MACRO cad
mov ax,datos
mov ds,ax;redireccion de datos

mov dx,00h
mov ah,09h
lea dx,cad
int 21h
mov ax,0
mov dx,0
endm
Ing MACRO M,num ;entra M y saca num=2bytes
mov ah,1
int 21h
sub al,30h
mov ah,0
mov dx,M
mul dx
add num,ax
endm

ImpNum MACRO N ;entra CX, N va de 1 a 10 a 100
mov ah,00h ;basta con moverlo a CX una ves para deducir todas
mov ax,cx ;sale ax=02
mov dx,0
mov bx,N
div bx
mov cx,dx ;guarda el residuo para despues
add al,30h
mov dx,ax
mov ax,00h
mov ah,2
int 21h
endm
;====MACRO QUE IMPRIME ARREGLOS DE NUMEROS====
ImpMatNum MACRO Matriz,n ;Imprime matriz de numeros
local load,fin ;requiere un 'salto' para ordenar bien
mov si,0 ;requiere un MACRO ImpNum para imprimir
load:
cmp si,n
jz fin
mov cx,Matriz[si]
ImpCad salto
ImpNum 1000
ImpNum 100
ImpNum 10
ImpNum 1
inc si
inc si
jmp load
fin:
endm
;=============================================
;====MACRO QUE IMPRIME ARREGLOS DE NUMEROS INVERTIDO====
ImpMatNumInv MACRO Matriz,n ;Imprime matriz de numeros invertido
local load,fin
;requiere un 'salto' para ordenar bien
mov si,n ;requiere un MACRO ImpNum para imprimir
load:
sub si,2
mov cx,Matriz[si]
ImpCad salto
ImpNum 1000
ImpNum 100
ImpNum 10
ImpNum 1

cmp si,0
jz fin
jmp load
fin:
endm
;=============================================
;========MACRO CARGA MATRIZ==========
LoadMat MACRO Matriz,n
local load,fin
mov si,0
load:
cmp si,n
jz fin ;condicion de salida

ImpCad salto
Ing 1000,elem
Ing 100,elem
Ing 10,elem
Ing 1,elem
mov ax,elem
mov Matriz[si],ax
mov elem,0 ;---->CLAVE:para no seguir sumando
add si,2
jmp load

fin:
endm
;salen modificados ax,dx
;=====================================
;=============MACRO DETECTA MINIMO===============
DetectaMin MACRO matriz,mini,n ;modifica bx,ax y requiere de si
local lazo,minimo,fin

mov si,0
mov ax,matriz[si]
mov cx,si
mov mini,ax
lazo:
add si,2
cmp si,n
jz fin

mov bx,matriz[si]
cmp bx,mini
jb minimo
jmp lazo
minimo:
mov ax,matriz[si]
mov mini,ax
mov cx,si
jmp lazo
fin:
mov bx,0
mov ax,0
;cx es el indice del minimo del arreglo
endm
;================================================
;
;
;
;
code segment
assume cs:code ds:datos

mov ax,datos
mov ds,ax
Programa:
ImpCad autor
ImpCad cad1

mov n,20 ;para 'n' elementos
mov ax,n
mul dos
mov n,ax ;las matrices trabajan con '2n', para 'n' elementos
mov si,0

LoadMat Mat,n ;aca tambien se modifica a 'SI'
;----detecta solo pares o impares de forma desordenada--------
mov si,0
bucle:
mov ax,Mat[si] ;transfiere 'Mat[si]' a 'ax'
mov t,si ;guardo si

and ax,1 ;detecta si es par o impar
cmp ax,1 ;comparo con 1
jz imparsito


parsito:
mov ax,Mat[si]
mov si,np
mov P[si],ax
add np,2
jmp conti


imparsito:
mov ax,Mat[si]
mov si,ni
mov I[si],ax
add ni,2
;jmp continua se sobre entiende
conti:
mov si,t ;recupero di
add si,2
cmp si,n
jz terminado

jmp bucle
;----------------------final de la operacion------------------------
terminado:
ImpCad pares
ImpMatNum P,np

ImpCad impares
ImpMatNum I,ni

ImpCad carga
ImpCad salto
;---------------Halla pares o impares ya ordenados----------------
mov di,0 ;'ni' y 'np' empiezan en cero
mov ni,0
mov np,0
lazito:
DetectaMin Mat,min,n ;bota indice del minimo a 'cx'


mov ax,min
mov MD[di],ax ;transfiere los minimos a 'MD[di]'
mov t,di ;guardo di

and ax,1 ;detecta si es par o impar
cmp ax,1 ;comparo con 1
jz impar


par:
mov ax,MD[di]
mov di,np
mov P[di],ax
add np,2
jmp continua


impar:
mov ax,MD[di]
mov di,ni
mov I[di],ax
add ni,2
;jmp continua se sobre entiende
continua:
mov di,t ;recupero di
add di,2
cmp di,n
jz salir

mov si,cx ;donde cx tiene el indice del ultimo minimo
mov bx,9999
mov Mat[si],bx

jmp lazito

salir:
;------------------------fin de la operacion-----------------------
seleccion:
ImpCad selector
mov ah,01
int 21h

cmp al,'a'
jz ImprimePar

cmp al,'d'
jz ImprimeImpar

jmp seleccion

ImprimePar:
;ImpCad ordenado
;ImpMatNum MD,n
;imprimo los pares e impares
ImpCad ASC
ImpCad salto
ImpMatNum P,np
jmp exit

ImprimeImpar:
ImpCad DSC
ImpCad salto
ImpMatNumInv I,ni
exit:
mov ah,1
int 21h
mov ah,4Ch
int 21h

code ends
end Programa

También podría gustarte