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.
;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
;---------------------------------------