A continuación les presento un código, hecho por mí, en el cual intento representar el funcionamiento de las Pilas y Colas estáticas y dinámicas, esperando que sea de ayuda para algunos.
lunes, 21 de diciembre de 2009
miércoles, 6 de mayo de 2009
Ensamblador - Convertir Minusculas a Mayusculas
Buenas noches...
El siguiente programa hace una conversion de minusculas a MAYUSCULAS. Utilizando varibales. Este programa fue conpilado con MASM32 utilizando DOSBox, el cual es un emuldor de MS-DOS.
Codigo:
Title Convertir minusculas a MAYUSCULAS
stacksg segment para STACK 'stack'
stacksg ends
datasg segment
PALABRA DB 64H DUP (?) ;SE DECLARA LA VARIABLE "PALABRA" DE TAMAÑO 100 (64H)
datasg ends
codesg segment
assume cs:codesg, ds:datasg, ss:stacksg
main proc far
prologo:
push ds
xor ax,ax
push ax
mov ax,datasg
mov ds,ax
LEA SI,PALABRA ; SE CARGA LA VARIBALE "PALABRA" EN 'SI'
INICIO:
MOV AH,01H ;SE CAPTURA EL CARACTER
INT 21H
CMP AL,0DH ;SE COMPARA CON ENTER
JE FINPALABRA ;SI ES IGUAL SALTA A 'FINPALABRA'
CMP AL,20H ;SE COMPARA CON EL ESAPACIO
JE ESPACIO ;SI ES IGUAL SALTA A ESPACIO
CMP AL,61H ;SE COMPARA CON a (MINUSCULA)
JB INICIO ;SI ES MENOR REGRESA A LA ETIQUETA INICIO
CMP AL,7AH ;SE COMAPRA CON z (MINUSCULA)
JA INICIO ;SI ES MAYOR SALTA A INICIO
;SI LA TECLA PRESIONADA ESTA ENTRE EL RAGO 61H Y 7AH
SUB AL,20H ;SE RESTA 20H A EL CARACTER ALMACENADO EN 'AL'
MOV [SI],AL ;SE MUEVE 'AL' A LA PRIMERA POSISION DE 'SI'
INC SI ;SE INCREMENTA 'SI'
JMP INICIO ;SE REGRESA A INCIO HASTA QUE SE PRESIONE ENTER
;SI SE PRECIONA UN ESPACIO
;SOLO SE INCREMENTE EL VALOR DE 'SI'
;Y SE REGRESA A INICIO
ESPACIO:
INC SI
JMP INICIO
FINPALABRA:
;PARA COMPROBAR SI LA CADENA ESTA VACIA
;SE HACE LO SIGUIENTE
MOV CX,0000H
CMP SI,CX ;SE COMPARA 'SI' CON 0 (CERO)
JE INICIO ;SI ES IGUAL REGRESA A INICIO
;SINO ESTA VACIA...
INC SI ;SE INCREMENTA 'SI'
MOV AL,'$' ;SE ASIGNA EL CARACTER DEL FIN DE LA CADENA A 'AL'
MOV [SI],AL ;SE CARGA EN 'SI'
;AQUI SOLO SE DESPLIEGA LA CADENA
;YA CONVERTIRDA EN MAYUSCULAS
MOV AH,09H
LEA DX,PALABRA
INT 21H
finalizar:
mov ah,4ch
int 21h
main endp
codesg ends
end main
end
El siguiente programa hace una conversion de minusculas a MAYUSCULAS. Utilizando varibales. Este programa fue conpilado con MASM32 utilizando DOSBox, el cual es un emuldor de MS-DOS.
Codigo:
Title Convertir minusculas a MAYUSCULAS
stacksg segment para STACK 'stack'
stacksg ends
datasg segment
PALABRA DB 64H DUP (?) ;SE DECLARA LA VARIABLE "PALABRA" DE TAMAÑO 100 (64H)
datasg ends
codesg segment
assume cs:codesg, ds:datasg, ss:stacksg
main proc far
prologo:
push ds
xor ax,ax
push ax
mov ax,datasg
mov ds,ax
LEA SI,PALABRA ; SE CARGA LA VARIBALE "PALABRA" EN 'SI'
INICIO:
MOV AH,01H ;SE CAPTURA EL CARACTER
INT 21H
CMP AL,0DH ;SE COMPARA CON ENTER
JE FINPALABRA ;SI ES IGUAL SALTA A 'FINPALABRA'
CMP AL,20H ;SE COMPARA CON EL ESAPACIO
JE ESPACIO ;SI ES IGUAL SALTA A ESPACIO
CMP AL,61H ;SE COMPARA CON a (MINUSCULA)
JB INICIO ;SI ES MENOR REGRESA A LA ETIQUETA INICIO
CMP AL,7AH ;SE COMAPRA CON z (MINUSCULA)
JA INICIO ;SI ES MAYOR SALTA A INICIO
;SI LA TECLA PRESIONADA ESTA ENTRE EL RAGO 61H Y 7AH
SUB AL,20H ;SE RESTA 20H A EL CARACTER ALMACENADO EN 'AL'
MOV [SI],AL ;SE MUEVE 'AL' A LA PRIMERA POSISION DE 'SI'
INC SI ;SE INCREMENTA 'SI'
JMP INICIO ;SE REGRESA A INCIO HASTA QUE SE PRESIONE ENTER
;SI SE PRECIONA UN ESPACIO
;SOLO SE INCREMENTE EL VALOR DE 'SI'
;Y SE REGRESA A INICIO
ESPACIO:
INC SI
JMP INICIO
FINPALABRA:
;PARA COMPROBAR SI LA CADENA ESTA VACIA
;SE HACE LO SIGUIENTE
MOV CX,0000H
CMP SI,CX ;SE COMPARA 'SI' CON 0 (CERO)
JE INICIO ;SI ES IGUAL REGRESA A INICIO
;SINO ESTA VACIA...
INC SI ;SE INCREMENTA 'SI'
MOV AL,'$' ;SE ASIGNA EL CARACTER DEL FIN DE LA CADENA A 'AL'
MOV [SI],AL ;SE CARGA EN 'SI'
;AQUI SOLO SE DESPLIEGA LA CADENA
;YA CONVERTIRDA EN MAYUSCULAS
MOV AH,09H
LEA DX,PALABRA
INT 21H
finalizar:
mov ah,4ch
int 21h
main endp
codesg ends
end main
end
martes, 5 de mayo de 2009
Ensamblador - Manejo de Variables
Manejo de Variables
Las variables son identificadores que hacen referencia a una posición de memoria donde se guarda algún valor útil para el programa y que puede ser modificado durante la ejecución de éste.
Las varibales se declaran en la segcion de datos (data segment).
Declaracion:
VARIABLE DB TAMAÑO DUP (VALOR)
Donde:
VARIABLE.- Es el nombre de la variable.
DB.- Significa que es de tipo byte.
TAMAÑO.- Es la longitud de la variable.
DUP (VALOR).- Es el valor por defecto para cada uno de los bytes de la variable.
Ejemplos de Declaración:
CADENA1 DB 14H DUP (?)
Crea una variable llamada CADENA1 de tipo byte con 20 posiciones
decimales y cada posición con cualquier valor.
CADENA2 DB 14H DUP (‘0’)
Crea una variable llamada CADENA2 de tipo byte con 20 posiciones
decimales y cada posición con el carácter ‘0’.
Las variables son identificadores que hacen referencia a una posición de memoria donde se guarda algún valor útil para el programa y que puede ser modificado durante la ejecución de éste.
Las varibales se declaran en la segcion de datos (data segment).
Declaracion:
VARIABLE DB TAMAÑO DUP (VALOR)
Donde:
VARIABLE.- Es el nombre de la variable.
DB.- Significa que es de tipo byte.
TAMAÑO.- Es la longitud de la variable.
DUP (VALOR).- Es el valor por defecto para cada uno de los bytes de la variable.
Ejemplos de Declaración:
CADENA1 DB 14H DUP (?)
Crea una variable llamada CADENA1 de tipo byte con 20 posiciones
decimales y cada posición con cualquier valor.
CADENA2 DB 14H DUP (‘0’)
Crea una variable llamada CADENA2 de tipo byte con 20 posiciones
decimales y cada posición con el carácter ‘0’.
sábado, 25 de abril de 2009
Empilar, Desempilar Y Un Ejemplo
Instrucciones Push (Empilar) y Pop (Desempilar)
La instruccion Push se utiliza para empilar un registro, ya que no se puede empilar un valor de forma directa. Por ejemplo
PUS AX
Nota: Recuerde utilizar registros completos, por ejemplo: AX, BX, CX, DX
Lo mismo sucede a la hora de desmpilar con la instruccion Pop, la cual desempila un registro previamente empilado.
POP AX
Ejemplo con Codigo ASCII.
El siguiente codigo es un ejemplo de manejo de caracteres, el cual imprime todo el codigo ASCII en columnas de 2o caracteres. Espero que el codigo sea lo bastante claro =D
El codigo fue compilado con MASM32.
Title Codigo ASCII
STACKS SEGMENT PARA STACK 'STACK'
;DB 64 DUP (0)
STACKS ENDS
DATA SEGMENT
COLUMNA DB 0 ;SE INICIALIZA LA VARIABLE COLUMNA
FILA DB 0 ;SE INICIALIZA LA VARIABLE FILA
DATA ENDS
CODESG SEGMENT
ASSUME CS:CODESG,DS:DATA,SS:STACKS
MAIN PROC FAR
PUSH DS
MOV AX, DATA
MOV DS, AX
LIMPIAR_PANTALLA:
MOV AX, 0600H ;LIMPIAR PANTALLA
MOV BH, 07H
MOV CX,0000H
MOV DX,184FH
INT 10H
MOV CX,0226
MOV AH,' '
CICLO:
MOV AH,02H ;COLOCA EL CURSOR
MOV BH,0H
MOV DH,FILA
MOV DL,COLUMNA
INT 10H
INC FILA ;SE INCREMENTA LA FILA PARA AUMENTA LA FILA
CMP FILA,20 ;SE COMPARA EL NUM DE FILAS CON 20
JNE MOSTRAR ;SE IMPRIMEN LOS PRIMEROS 20 CARACTERES
MOV FILA, 0 ;SE VUELVE A INICIALIZAR LA FILA EN CERO
ADD COLUMNA,10 ;SE INCREMENTA LA COLUMNA
MOSTRAR:
MOV AH,0EH ;IMPRIMIR 1 SOLO CARACTER
INT 10H
INC AL ;INCREMENTA EN AL PARA EL SIGUIENTE CARACTER
LOOP CICLO
CURSOR:
MOV AH,02
MOV DL,40
MOV BH,40
INT 10H
FIN:
MOV AX, 4CH
INT 21H
MAIN ENDP
CODESG ENDS
END MAIN
END
La instruccion Push se utiliza para empilar un registro, ya que no se puede empilar un valor de forma directa. Por ejemplo
PUS AX
Nota: Recuerde utilizar registros completos, por ejemplo: AX, BX, CX, DX
Lo mismo sucede a la hora de desmpilar con la instruccion Pop, la cual desempila un registro previamente empilado.
POP AX
Ejemplo con Codigo ASCII.
El siguiente codigo es un ejemplo de manejo de caracteres, el cual imprime todo el codigo ASCII en columnas de 2o caracteres. Espero que el codigo sea lo bastante claro =D
El codigo fue compilado con MASM32.
Title Codigo ASCII
STACKS SEGMENT PARA STACK 'STACK'
;DB 64 DUP (0)
STACKS ENDS
DATA SEGMENT
COLUMNA DB 0 ;SE INICIALIZA LA VARIABLE COLUMNA
FILA DB 0 ;SE INICIALIZA LA VARIABLE FILA
DATA ENDS
CODESG SEGMENT
ASSUME CS:CODESG,DS:DATA,SS:STACKS
MAIN PROC FAR
PUSH DS
MOV AX, DATA
MOV DS, AX
LIMPIAR_PANTALLA:
MOV AX, 0600H ;LIMPIAR PANTALLA
MOV BH, 07H
MOV CX,0000H
MOV DX,184FH
INT 10H
MOV CX,0226
MOV AH,' '
CICLO:
MOV AH,02H ;COLOCA EL CURSOR
MOV BH,0H
MOV DH,FILA
MOV DL,COLUMNA
INT 10H
INC FILA ;SE INCREMENTA LA FILA PARA AUMENTA LA FILA
CMP FILA,20 ;SE COMPARA EL NUM DE FILAS CON 20
JNE MOSTRAR ;SE IMPRIMEN LOS PRIMEROS 20 CARACTERES
MOV FILA, 0 ;SE VUELVE A INICIALIZAR LA FILA EN CERO
ADD COLUMNA,10 ;SE INCREMENTA LA COLUMNA
MOSTRAR:
MOV AH,0EH ;IMPRIMIR 1 SOLO CARACTER
INT 10H
INC AL ;INCREMENTA EN AL PARA EL SIGUIENTE CARACTER
LOOP CICLO
CURSOR:
MOV AH,02
MOV DL,40
MOV BH,40
INT 10H
FIN:
MOV AX, 4CH
INT 21H
MAIN ENDP
CODESG ENDS
END MAIN
END
Codigos de Ensamblador - Captura e Impresión De Texto
Leer carácter con Echo.
La lectura de un carácter con Echo permite que, el carácter es leído es impreso el mismo tiempo.
MOV AH,01H
INT 21H
Nota: El valor del carácter (en hexadecimal) es guardado en el registro AL
Leer carácter Sin Echo.
La lectura de un carácter Sin Echo simplemente captura el carácter pero no lo imprime. Se puede hacer mandando dos valores al registro AH: 07H ó 08H
MOV AH,07H
INT 21H
Nota: El valor del carácter (en hexadecimal) es guardado en el registro AL
Desplegar un carácter.
MOV AH,02H
MOV DL,caracter
INT 21H
Donde:
MOV AH,09H
LEA DX,mensaje
INT 21H
Donde:
La lectura de un carácter con Echo permite que, el carácter es leído es impreso el mismo tiempo.
MOV AH,01H
INT 21H
Nota: El valor del carácter (en hexadecimal) es guardado en el registro AL
Leer carácter Sin Echo.
La lectura de un carácter Sin Echo simplemente captura el carácter pero no lo imprime. Se puede hacer mandando dos valores al registro AH: 07H ó 08H
MOV AH,07H
INT 21H
Nota: El valor del carácter (en hexadecimal) es guardado en el registro AL
Desplegar un carácter.
MOV AH,02H
MOV DL,caracter
INT 21H
Donde:
- caracter debe de contener el valor en hexadecimal del carácter que se desea imprimir ó bien el mismo carácter encerrado entre apostrofes (ejemplo: MOV DL,'A'... ó MOV DL,41H)
MOV AH,09H
LEA DX,mensaje
INT 21H
Donde:
- mensaje debe estar previamente declarado en el segmento de datos (mensaje DB 'HoLa MuNdO$'
- Recuerden que todos los mensajes terminan con un símbolo de pesos ($)
viernes, 24 de abril de 2009
Codigos de Ensamblador - Fecha, Hora y Funciones de Pantalla
Buenas noches a todos.
Como lo dije en la entrada anterior, aquí les dejo unos cuantos códigos para realizar ciertas funciones en Lenguaje Ensamblador. Aquí mostrare algunas funciones de pantalla y entrada de datos (teclado). Esperando que ayude a muchos (^_^)
Obtener la fecha.
MOV AH,2AH
INT 21H
NOTA: La información se guarda en los siguientes registros:
MOV AH,2CH
INT 21H
Nota: La información se guarda en los siguientes registros:
MOV AX,0600H ;Llamada a la función
MOV BH,07H ;color de fondo y color de letra
MOV CX,0000H ;coordenadas de inicio
MOV DX,184FH ;coordenadas de fin
INT 10H
Donde:
MOV AH,02H ;Llamada a la función
MOV BH,00H ;pagina 0
MOV DH,05H ;Fila
MOV DL,10H ;Columna
INT 10H
Donde:
Como lo dije en la entrada anterior, aquí les dejo unos cuantos códigos para realizar ciertas funciones en Lenguaje Ensamblador. Aquí mostrare algunas funciones de pantalla y entrada de datos (teclado). Esperando que ayude a muchos (^_^)
Obtener la fecha.
MOV AH,2AH
INT 21H
NOTA: La información se guarda en los siguientes registros:
- AL = Dia de la semana(Domingo=0)
- CX = Año
- DH = Mes
- DL = Día del mes
MOV AH,2CH
INT 21H
Nota: La información se guarda en los siguientes registros:
- Hora = CH
- Minutos = CL
- Segundos = DH
- Milisegundos = DL
MOV AX,0600H ;Llamada a la función
MOV BH,07H ;color de fondo y color de letra
MOV CX,0000H ;coordenadas de inicio
MOV DX,184FH ;coordenadas de fin
INT 10H
Donde:
- Las coordenadas de inicio y de fin son para Fila-Columna, suponiendo que la pantalla esta en un tamaño de 25 filas por 80 columnas.
- Las coordenadas de inicio y de fin se dan en valor hexadecimal, fila y columna
- La primera columna es la numero 0 (cero) al igual que la primera fila es 0 (cero).Color de fondo; donde 0 = Negro y 7 = Blanco
MOV AH,02H ;Llamada a la función
MOV BH,00H ;pagina 0
MOV DH,05H ;Fila
MOV DL,10H ;Columna
INT 10H
Donde:
- Es la pagina donde se va a colocar el cursor
- El valor de Fila se da en hexadecimal
- El valor de Columna se da en hexadecimal
Bienvenidos Uno y Todos!!!
Buenas noches a todos...
Esta es la primera entrada que realizo en un blog, hare todo lo posible por subir informacion lo mas seguido posible: codigos, trucos para windows, etc...
Como aviso y entretenimiento para todos, la proxima entrada sera sobre lenguaje emsamblador; codigos para limpiar pantalla, colocar el cursor.
Sin mas por el momento, me despido de uds.
Muchas gracias por la visita
(^_^)\../
ATTE
Mr. Purple
Suscribirse a:
Entradas (Atom)