altera el orden de una cadena al revés

Un ejercicio de escuela para un maestro odioso, pero aquí está, espero y le sirva a alguien más.

Búsqueda de ejemplos en Ensamblador
;Autor Hugo Adrián Delgado Rodríguez
;URL http:mx.geocities.com/iiakusii

TITLE El siguiente programa transforma el orden de una cadena al revés de como la ingreso el usuario


cr EQU 10
lf EQU 13


;---------------------------------------------
;              DATOS
;---------------------------------------------

VARIABLES SEGMENT PARA PUBLIC
       
        mensaje0 DB '                               ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»$'
        mensaje1 DB 'ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹°°BIENVENIDO°°ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»$'
        msj      DB 'º                             ÈÍÍÍÍÍÍÍÍÍÍÍÍÍͼ                               º$'           
        msj1     DB 'ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»                                                         º$'
        mensaje2 DB 'ºINGRESE LA CADENA:ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ$'
        msj2     DB 'ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ$'
        maximo_caracteres DB 40  ;maximo de caracteres a introducir
        lencad DB 0
        cadena DB 40 DUP(0)
        girat DB 40 DUP(0)
        linea_en_blanco  DB cr,lf,'$'
        mensaje4 DB 'LA CADENA CAMBIADA ES:$'
        mensaje5 DB 'PRESIONE ENTER PARA SEGUIR...$'
        mensaje3 DB 'DESEA SALIR DEL PROGRAMA? (S/N)$'
        maximo_caracteres2 DB 2         ;longitud máxima.
        lencad2 DB 0                    ;longitud leida.
        cadena2 DB 2 DUP(0)             ;buffer que contendrá el texto introducido.

VARIABLES ENDS

;---------------------------------------------
;              SEGMENTO
;---------------------------------------------

CODIGO SEGMENT PARA PUBLIC 'code'
        main PROC FAR
ASSUME CS:CODIGO,DS:VARIABLES,SS:pila,ES:VARIABLES
        mov ax,VARIABLES
        mov ds,ax
        mov es,ax

;----------------------------------------
;              LLAMADO A MACROS
;----------------------------------------

        LIMPIAR MACRO
             mov ax,0600h
             mov bh,127
             mov cx,0000h
             mov dx,184fh
             int 10h
        ENDM

        GOTOXY  MACRO x,y
             xor bh,bh
             mov dl,x
              mov dh,y     
             mov ah,02h
             int 10h
        ENDM

        IMPRIME MACRO arg1
                push ax
                push dx
                lea dx,arg1
                mov ah,9
                int 21h
                pop dx
                pop ax
        ENDM
 
        LEE     MACRO arg1
                push ax
                push dx
                lea dx,arg1
                mov ah,10
                int 21h
                pop dx
                pop ax
        ENDM

;-----------------------------------------
;              INICIO
;-----------------------------------------

INICIO:
       
        LIMPIAR
        GOTOXY 0,0
        IMPRIME mensaje0
        GOTOXY 1,2
        IMPRIME msj
        GOTOXY 1,3
        IMPRIME msj1
        GOTOXY 1,5
        IMPRIME msj2   
        GOTOXY 1,1
        IMPRIME mensaje1
        GOTOXY 1,4
        IMPRIME mensaje2                ;pide que se introduzca un mensaje y lo guarda en MAXIMO_CARACTERES
        GOTOXY 1,7
        LEE maximo_caracteres
        imprime linea_en_blanco  ;imprime lina en blanco
        mov bx,0                        ;pone el registro bx a 0

;----------------------------------------
;              PROCEDIMIENTOS
;----------------------------------------
       
pushpila:
        mov al, cadena[bx]            ;movemos la cadena introducida a al
        push ax
        inc bl
        cmp bl, lencad      ;hacemos la comparacion para que el proceso se repita mientras bl no sea 0
        jne pushpila       
        mov bx, 0
poppila:
        pop ax
        mov girat[bx], al              ;extraemos la cadena del registro ax
        inc bl        ;incrementamos el registro bl para comparar con lencad
        GOTOXY 24,9
        cmp bl,lencad
        jne poppila               ;si el registro bl no es = que el valor de lencad repetimos el proceso
        mov girat[bx], '$'
        imprime girat
        IMPRIME linea_en_blanco
       
        GOTOXY 1,9
        IMPRIME mensaje4
        GOTOXY 25,14
        IMPRIME mensaje5
        LEE maximo_caracteres2
        IMPRIME linea_en_blanco

        GOTOXY 24,15
        IMPRIME mensaje3
        GOTOXY 39,17
        LEE maximo_caracteres2
        IMPRIME linea_en_blanco

;---------------------------------------
;              OPCION DE SALIDA
;---------------------------------------

        cmp cadena2[0],'s'
        je salir
        cmp cadena2[0],'S'
        je salir
        jmp inicio
salir:
        mov ax,4c00h
        int 21h

;---------------------------------------
;                FIN
;---------------------------------------

main ENDP
CODIGO ENDS
pila SEGMENT PARA STACK 'stack'
DB 128 DUP(0)
pila ENDS
END main
;---------------------------------------