Hola,¿Como estan? :)  Realmente quisiera unas sugerencias o que me hagan la correciones necesarias,serian muy amables por eso y por su tiempo :) ,Les paso a detallar el enunciado:
Un programa que ordene las letras de una oración de hasta 40 (cuarenta) caracteres juntando las vocales y las consonantes de acuerdo a la letra de comienzo, de la siguiente manera:
a)   Se debe permitir el ingreso de cualquier elemento del teclado (entiéndase: letras, números y caracteres especiales).
b)   Si la palabra comienza con vocal, todas las vocales deberán ser ubicadas al principio siguiendo el orden de aparición y posteriormente las consonantes de acuerdo a su aparición.
c)   Si en el medio de la palabra aparece un número, o un carácter especial, este debe ser eliminado del conjunto de palabras, y colocado separadamente indicando cual es la posición del mismo en el conjunto original.
d)   Si el carácter especial o número aparece como cierre de una palabra, frase u oración este debe conservar el lugar y no ser separado del conjunto inicial.
Ejemplos:
Estos serían 3 ejemplos básicos, pero podría escribirse cualquier cosa tenga o no sentido
1)Esta historia es larga y entusiasta
2)La comi#$da esta aceitosa pero sa;=brosa
3)Estaba esperando1 cuando aparecio?
Bien ahora analicemos uno por uno.
                                  1)Esta historia es larga y entusiasta
DEBE DEVOLVER:   East hstrioia es lrgaa y euiaantsst
Observen que en este ejemplo la tercera palabra no tiene modificación porque es de 2 letras pero las otras si se han modificado para obtener el resultado solicitado. 
Vamos al segundo ejemplo 
                                 2)La comi#$da esta aceitosa pero sa;=brosa
DEBE DEVOLVER:  La cmdoia east aeioacts preo sbrsaoa
                                     # posicion 8
                                     $ posicion 9
                                     ; posicion 34
                                  = posicion  35
Como ven hemos sacado los caracteres especiales. En este ejemplo están seguidos pero pueden estar en cualquier lugar y también tengan en cuenta que también pueden ser números. 
Vamos al tercer ejemplo. 
                                  3)Estaba esperando1 cuando aparecio?
DEBE DEVOLVER:  Eaastb eeaosprnd1 cnduao aaeioprc?
Nótese que en este ejemplo los números y caracteres especiales que aparecen no se mueven y no se informan porque están al final de la palabra.
Los ejemplos dos y tres pueden estar mezclados.
-----------------------------------------------------------------------------------------------------------------------------------------------------
Les voy a explicar brevemente el codigo y a grandes rasgos:
Tengo un primero vector que obtiene los caracteres,luego lo que hago es proceder a "rastrear" los caracteres y dividirlos segun sean vocales (mayusculas o minusculas) o consonantes(mayusculas o minusculas) .Si,obviamente no es ninguno de ellos,es un caracter especial:
Les explico los procedimientos brevemente y a grandes rasgos:
A)Obtengo mi primer vector en la etiqueta veccadena_llenado
B)Luego voy a la etiqueta Rastreo,en donde pregunto si son vocales o consonantes ,si es verdad,voy a sus respectivas etiquetas hago la impresion del caracter(no se que elemento puedo usar para esto un segundo vector o variable de tipo string que acepte la escritura de caracteres)
C)Si no es ninguna vocal o consonante  sera un caracter especial,en donde voy hasta un procedimiento que se encarga de SEPARAR ,IMPRIMIR Y DECIRME LA POSICION EN LA CUAL FUE ENCONTRADO
Bueno ahora les voy a mostrar como lo tengo planificado ( yo uso el emu8086 ):
#make_COM#    
org 100h
.stack ;Declaramos el tamanio de la pila ¿No? 
   
.data;declaraciones de los vectores y otras variables que vamos a usar
declariaciones de los vectores y otras variables que vamos a usar
.code text   ;Empieza el programa en si mismo
;-------------------------------------------------------------------
 
veccad_llenado:;Etiqueta en la cual vamos a proceder a llenar el 
               ;vector y ademas tener en cuenta si el usuario borro
               ;algun caracter.  
               
               ;Ademas tenemos que averiguar el tamanio final del 
               ;vector para poder trabajar con el loop "rastreo"
               
               ;Ademas ya sea en este vector o antes,tenemos que
               ;mostrar el mensaje: "Ingrese su cadena:" " "(espacio)
;-------------------------------------------------------------------    
                
               
mov cx,"X"     ;ES UN EJEMPLO PERO LA IDEA ES:
               ;POR ESTO MISMO,NECESITAMOS EL TAMANIO VERDADERO DEL
               ;VECTOR,PARA PODER LOOPEARLO Y RASTREAR Y DIVIDIR LOS
               ;CARACTERES,ESO BUSCAMOS.
               
;------------------------------------------------------------------- 
;Antes  de empezar con la siguiente etiqueta ,Luego del mensaje:
;"Ingrese su cadena:" (con su respectivo espacio).
;Despues de esto,hay que dejar un renglon hacia abajo y luego:
;"La cadena reordenada es:" y luego empezar a escribir a continuacion.
;1 sola vez el mensaje por supuesto. 
;-------------------------------------------------------------------- 
                          
rastreo:       ;Etiqueta en la cual vamos a COMPARAR EL CONTENIDO
            ;EN LA PRIMERA POSICION DE ESE VECTOR(veccadena-contenido-)
               ;obviamente,por las vocales,ESA ES LA IDEA:
                                
              
CMP veccadena(contenido),'A' ;Empezamos por mayusculas,si es asi(JE),
                             ;SALTO hasta la etiqueta llamada 
JE imp_voc                   ;"impresion_voc". 
            
;(Una pregunta:Si salto hasta una etiqueta,no se como volver/retomar la
;siguiente instruccion.Cuando haces un CALL "nombreproc" yo se que al 
;final "RET" retorna alpunto exacto donde fue llamado,pero con una 
;simple etiqueta no se como hacerlo ).Sospecho que es poniendo la misma
;instruccion RET al final de la etiqueta "imp_voc". 
 
 
CMP veccadena(contenido),'a';Si la comparacion anterior no resulta 
                            ;IGUAL (JE) comparamos denuevo por la misma
                            ;letra pero en minuscula si es asi(JE)
                            ;SALTO hasta la misma etiqueta 
JE imp_voc                  ;"impresion_voc"  
 
 
;(Aca me surje la misma pregunta,me surje la misma duda en todas las 
;instrucciones:Si salto hasta una etiqueta no se como volver/retomar la
;siguiente instruccion.Cuando haces un CALL "nombreproc" yo se que al 
;final "RET" retorna al punto exacto donde fue llamado,pero con una 
;simple etiqueta no se como hacerlo ).Sospecho que es poniendo la misma
;instruccion RET al final de la etiqueta "imp_voc". 
          
CMP veccadena(contenido),'E'
JE imp_voc
CMP veccadena(contenido),'e'
JE imp_voc
CMP veccadena(contenido),'I'
JE imp_voc
CMP veccadena(contenido),'i'
JE imp_voc
CMP veccadena(contenido),'O'
JE imp_voc
CMP veccadena(contenido),'o'
JE imp_voc
CMP veccadena(contenido),'U'
JE imp_voc
CMP veccadena(contenido),'u'
JE imp_voc                       
;Bueno,repetimos este paso con todas la vocales mayusculas y minusculas.
                
;----------------------------------------------------------  
;Obviamente,si no es ninguna vocal(mayus. o minus.) 
CMP veccadena(contenido),65  ;Vamos a COMPARAR,SI EL CONTENIDO EN LA 
                             ;PRIMERA POSICION DE ESE VECTOR
                             ;(veccadena-contenido-)ESTA POR ABAJO(JB) 
                             ;del codigo 65 en decimal que representa 
                             ;la "A" (segun la tabla ASCII). 
                             
JB vecespeciales             ;SI ESTA POR ABAJO,vamos a vecespeciales 
                              
CMP veccadena(contenido),90  ;SI NO ESTA POR ABAJO,volvemos a comparar
                             ;SI EL CONTENIDO EN LA PRIMERA POSICION DE 
                             ;ESE VECTOR(veccadena-contenido-)
                             ;SI ESTA POR ABAJO O ES IGUAL(JBE)que el 
                             ;codigo 90 en decimal que representa la
                             ;"z"(segun la tabla ASCII).
               
                             ;SI ES ASI,SIGNIFICA QUE ESTA DENTRO DE 
                             ;LAS MAYUSCULAS POR LO TANTO VAMOS A LA 
JBE imp_conso                ;ETIQUETA "imp_conso"
  
  
CMP veccadena(contenido),97  ;SI NO ESTA POR ABAJO O ES IGUAL A 90
                             ;comparamos,SI EL CONTENIDO EN LA PRIMERA
                             ;POSICION DE ESE VECTOR
                             ;(veccadena-contenido-)ESTA POR ABAJO(JB) 
                             ;DE 97 el codigo en decimal que representa 
                             ;la "a".
               
                             ;SI ESTA POR ABAJO DE 97,nos vamos a
JB vecespeciales             ;vecespeciales
                                   
                   
CMP veccadena(contenido),122 ;SI NO ESTA POR ABAJO DE 97,comparamos 
                             ;SI EL CONTENIDO EN LA PRIMERA POSICION 
                             ;DE ESE VECTOR(veccadena-contenido)SI ESTA
                             ;POR ABAJO O ES IGUAL(JBE)que el codigo 
                             ;122 que en decimal representa la "z".
               
                             ;SI ESTA POR ABAJO O ES IGUAL de 122
JBE imp_conso                ;vamos a "imp_conso" 
               
               
                             ;SI NO ESTA EN NINGUN LADO ANTERIOR
                             ;SIGNIFICA QUE ES MAS GRANDE QUE 122
CALL vecespeciales           ;por lo tanto hacemos CALL vecespeciales
               
;------------------------------------------------------------------
 
;Luego,hacemos la etiqueta Retomo,en la cual adentro hacemos una 
;variable contadora del vector y por supuestoincrementamos el 
;vector(para recorrerlo) por ultimo,loop rastreo para volver a rastrear.
Retomo:
*Variable contadora del vector  ;La voy a usar en "vecespeciales"
*Incrementas el vector (para recorrerlo)  
*Pregunto si el contenido en esa posicion del vector es igual a "enter"
*Si es igual ,ponemos "Pulse un tecla" o simplemente se termina el 
programa(mostrando todas las consignas obviamente)
loop rastreo
;------------------------------------------------------------------
 
 
 
 
vecespeciales PROC   
    
;Despues del mensaje "Ingrese su cadena:"(con su respectivo espacio)
;Tenemos que dejar un renglon hacia abajo,es decir vamos a graficar la
;situacion:
;Ingrese su cadena: 123 2est5aba6 donde
;La cadena reordenada:xxxxxx6 xxxx 
;1 posicion 1                        ;TODO ESTO HACE "vecespeciales"
;2 posicion 2                        ;TODO ESTO HACE "vecespeciales"
;3 posicion 3                        ;TODO ESTO HACE "vecespeciales"
;2 posicion 5                        ;TODO ESTO HACE "vecespeciales"
;5 posicion 9                        ;TODO ESTO HACE "vecespeciales"
;Como vieron dentro de esta funcion lo que se va hacer seria la parte
;de lo caracteres especiales y con mensajes consecutivos dejando
;un espacio,todo esto depende de lo que se ingrese ,es decir:
;Se los imprime,espacio en blanco  y luego se imprime la posicion.
;Para llevar a cabo dentro de esta funcion lo que se necesita es el 
;contenido de la direccion del vector (o el contenido,lo que sea 
;posible) y el contador de la etiqueta "rastreo" para eso la creamos.
                  
                  
              RET 
              
vecespeciales ENDP  
;-------------------------------------------------------------------
imp_voc:
;Ya sea que usemos un segundo vector o un cadena de tipo string en
;donde se pueda escribir a traves de 2 etiquetas 
;Esta etiqueta  lo que hace obviamente recibe el contenido de veccadena
;y lo imprime en el elemento que usemos (vector o una cadena o variable
;de caracteres) luego hace el (JMP) hacia "Retomo" dentro de "Rastreo"
;Es decir:
codigo
JMP Retomo 
;---------------------------------------------------------------------
imp_conso:
;Lo mismo que la etiqueta "imp_voc"
codigo
JMP Retomo
;--------------------------------------------------------------------
ret
-------------------------------------------------------------------------------------------------------------------------------------------------
Espero sus sugerencias ya que mi planteo presenta errores y  espero sus consejos,COMO LES DIJE ANTES LES AGRADEZCO SU TIEMPO,DE VERDAD,MUCHAS GRACIAS.
Mod: Los códigos deben ir en etiquetas GeSHi