Guest User

Untitled

a guest
Sep 26th, 2013
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #MAKE_COM# ; instruct compiler to make COM file.
  2. ORG 100h ; directive required for a COM program.    
  3.  
  4.  
  5. ;Es muy ineficiente, seguramente no estoy usando la pila de la manera que deberia
  6. ;y tendria que aplicar algun algoritmo menos ineficiente. Ahora estoy dando
  7. ;Cantidad de chars * (Min 1) - (Max Cantidad de chars -1)
  8. ;Seria mejor implementar insertion sort en vez de bubblesort.
  9. LEA SI,S_HOLA
  10. CALL Ordenar
  11. CALL Imprimir
  12.  
  13.  
  14. RET ; returns to operating system.        
  15.  
  16.  
  17. Ordenar PROC ;SI tiene el parametro que es la direccion de memoria del string  
  18.     MOV CX,0
  19.     PUSH SI ;Guardo la direccion de la variable en pila antes de modificarla  
  20.    
  21.    
  22.    
  23.     for_ordenar:
  24.     CMP b.[SI+1],0
  25.     JZ vueltas_ordenar ;Termine una vuelta de palabra, faltan vueltas por ahi
  26.    
  27.     MOV AL,[SI]
  28.     CMP [SI+1], AL
  29.     ;Comparo el siguiente ([SI+1]) con el actual (AL)
  30.     JC cambio_ordenar ;SI  [SI] > [SI+1]
  31.  
  32.     ADD SI,1
  33.     ADD CX,1
  34.     JMP for_ordenar ;Empiezo el loop de nuevo
  35.    
  36.    
  37.     vueltas_ordenar:  
  38.     MOV DX, SI ;EL SI actual (SI + La cantidad de caracteres)
  39.     POP SI ;Agarro el SI original (SI Actual - La cantidad de caracteres)
  40.     SUB DX, SI ;Cantidad de vueltas que necesito dar (cantidad de chars en el string)
  41.                ;(En realidad es una menos porque es de a pares)
  42.     CMP CX,DX
  43.     JZ stop_ordenar
  44.    
  45.     PUSH SI ;Guardo la direccion de la variable en pila
  46.     MOV CX,0
  47.     MOV AL,0
  48.    
  49.     JMP for_ordenar
  50.    
  51.     cambio_ordenar:  
  52.     ;Tengo que meter AL/SI en SI+1 y vice versa      
  53.     PUSH [SI+1]
  54.     MOV [SI+1],AL
  55.     POP AX
  56.     MOV [SI],AL
  57.     ADD SI,1
  58.     JMP for_ordenar
  59.  
  60.    
  61.     stop_ordenar:
  62.     RET
  63. Ordenar ENDP
  64.            
  65.            
  66.            
  67. Imprimir PROC ;Imprimo lo que tengo en SI
  68.     MOV AH,0Eh
  69.    
  70.     for_imprimir:
  71.     MOV AL,[SI]
  72.     CMP b.[SI],0
  73.     JZ stop_imprimir
  74.    
  75.     INT 10h
  76.     ADD SI,1  
  77.    
  78.     JMP for_imprimir
  79.     stop_imprimir:
  80.     RET
  81. Imprimir ENDP
  82.    
  83.  
  84. S_HOLA DB 'ABCDEFGHIJK', 0 ;El signo $ es para que 21h sepa cuando parar de imprimir
  85.  
  86. END
Advertisement
Add Comment
Please, Sign In to add comment