SoloCodigo
Programación General => ASM (Ensamblador) => Mensaje iniciado por: cybergatita en Sábado 7 de Octubre de 2006, 20:41
-
Que tal, ando por el tema nuevamente, chicos.
Pues en busca de información encontre algo sobre como leer/obtener un string desde entrada estandar y despues darle salida estandar, (teclado y monitor), si encontre algo!!!!!-
Me compila pero solo me manda el string que puse sobre pregunta,
Me podrian asesorar,,,,
saludos a todos, , y saludos especiales a iternal doll y tania_d
.MODEL SMALL
.DATA
TEXTO DB '¨ CUAL ES TU NOMBRE ? <escribelo>. $'
DB 13,10,13,10
TEXTO1 DB 30
TEXTO2 DB 30 DUP(0)
.CODE
PROGRAMA:
MOV AX,@DATA
MOV DS,AX
MOV DX,OFFSET TEXTO
MOV AH,9
INT 21H
MOV AX,4C00H
INT 21H
MOV AH,3FH
MOV BX,0
MOV CX,30
MOV DX,30
INT 21H
AND AX,AX
MOV CX,30
MOV AH,40H
MOV BX,1
MOV DX,OFFSET TEXTO2
INT 21H
.STACK
End PROGRAMA
-
Primero y principal mira donde esta este codigo y que hace:
Despues fijate en la lectura de teclado que estas haciendo ... ¿Donde pasas el buffer donde guardar los datos?: http://www.ctyme.com/intr/rb-2783.htm (http://www.ctyme.com/intr/rb-2783.htm)
PD. Mi nick es Eternal Idol ...
-
... Lo siento lo deje puesto ahi el codigo de terminacion.
P.D no me di cuenta Eternal Idol ...
-
Si pones eso donde debe ir y le pasas el buffer necesario a la lectura de teclado el codigo funciona, son dos cambios minimos B)
-
/**** Si pones eso donde debe ir y le pasas el buffer necesario a la lectura de teclado el codigo funciona, son dos cambios minimos***/
buffer?
checando estos ejemplos
MOV AH,3FH
MOV BX,0
MOV CX,[LONGITUD MAXIMA]
MOV DX,[DESTINO DE LA CADENA]
INT 21H
AND AX,AX
y este
AH = 0AH
DS:DX = Dirección del área de almacenamiento
BYTE 0 = Cantidad de bytes en el área
BYTE 1 = Cantidad de bytes leídos desde BYTE 2 hasta BYTE 0 + 2 = caracteres leído
Tal vez no logro entender el buffer :(
-
http://www.ctyme.com/intr/rb-2783.htm (http://www.ctyme.com/intr/rb-2783.htm)
Mira de nuevo y fijate que estas pasandole a esa interrupcion en DX y que deberias pasarle en realidad ...
-
Eternal Idol
Gracias chico
solo faltaba el offset en dx y al ultimo las instrucciones de terminacion
... Gracias por tu ayuda:).
-
Eternal Idol
Gracias chico
solo faltaba el offset en dx y al ultimo las instrucciones de terminacion
... Gracias por tu ayuda:).
De nadas y si solo faltaban esas dos cositas B)
-
sip ya me di cuenta,, eres buen maestro ehhhh :comp: :comp: :P
Aprovechando tu amabilidad,existira aguna instruccion que cuando yo teclee un solo caracter me de su valir en asci.?
saludos
-
Hay que buscar:
http://www.ctyme.com/intr/int.htm (http://www.ctyme.com/intr/int.htm)
http://www.ctyme.com/intr/int-21.htm (http://www.ctyme.com/intr/int-21.htm)
-
Ok, conforme a tu link.
http://www.ctyme.com/intr/int-21.htm (http://www.ctyme.com/intr/int-21.htm)
Encontre tambien esto:
Función 00H
Leer un caracter del teclado.
Registros de llamada:
AH = 00H ; PIENSO QUE ESTA FUNCION ES LA QUE ME SIRVE.
Registros de retorno:
AH = código de barrido (scan code) del teclado
AL = Valor ASCII del caracter.
y
Leer un caracter del teclado y desplegarlo.
Registros de llamada:
AH = 01H
Registros de retorno:
AL = Caracter leído
.CODE
Empieza:
MOV AX,@DATA
MOV DS,AX
MOV DX,OFFSET MENSAJE ;Aqui solo mando un mensaje que defini en AREA DATOS
MOV AH,9
INT 21H
MOV AH,00H ;Aqui Leo mi tecla
INT 16H
MOV AH,02H ; Aqui pienso desplegarla, falta un registro, vdd?
; Despliega un caracter a la pantalla.
Registros de llamada:
AH = 02H
DL = Valor del caracter a desplegar.
MOV AX,4C00H
INT 21H
-
Tenes que probar mas el codigo. En este caso te falta darle un valor a DL ... ¿Cual sera? El que te devuelva la interrupcion 16h en AL.
-
MOV AH,00H ;Aqui Leo mi tecla
INT 16H
MOV AH,02H ; Aqui pienso desplegarla,
MOV DL, AL ; Lo que faltaba?... siento que no
INT 21H
MOV AX,4C00H
INT 21H
Asi solo me lee el caracter que introduzco
Tenes que probar mas el codigo. En este caso te falta darle un valor a DL ... ¿Cual sera? El que te devuelva la interrupcion 16h en AL.
Return:
AL = status
00h successful
FFh directory full or file exists and is read-only or locked
Me devuelve el status, que status?... del teclado? y asi me visualizara su valor ascii?
-
MOV DL, AL ; Lo que faltaba?... siento que no
Asi solo me lee el caracter que introduzco
Si, eso era lo que faltaba. Y no, asi lee lo que escribis y despues lo muestra en pantalla. Fijate si estas ensamblando bien, si estas comprobando el ejecutable que ensamblaste por ultima vez, etc. Ese codigo es correcto.
Y la int 16h con el servicio 0 no devuelve eso de status sino esto:
KEYBOARD - GET KEYSTROKE
AH = 00h
Return:AH = BIOS scan code
AL = ASCII character
-
MOV AH,00H
INT 16H
MOV AH,02H
MOV DL,AL
INT 21H
MOV AX,4C00H
INT 21H
.STACK
mm ok, entonces tal vez entendi mal, aqui solamente me va a leer y desplegar como hasta el momento lo he hecho.Pero para yo poder desplegar su codigo ASCII de la tecla o caracter que presione, entonces falta codificar lo que me mencionas?
esto?. de la interrupcion 16?
Y la int 16h con el servicio 0 no devuelve eso de status sino esto:
KEYBOARD - GET KEYSTROKE
AH = 00h
Return:AH = BIOS scan code
AL = ASCII character
-
Con eso escribis la letra en pantalla como te decia antes. Si lo que queres es el numero en decimal entonces vas a tener bastante mas trabajo ... tenes que implementar la funcion ltoa (al menos para la raiz de diez) ... o buscar algo que lo haga ... no se si existe.
-
ah
Pense mal
Registros de llamada:
AH = 00H
Registros de retorno:
AH = código de barrido (scan code) del teclado
AL = Valor ASCII del caracter.
Cuando se utiliza esta interrupción se detiene la ejecución del programa hasta que se introduzca un caracter desde el teclado, si la tecla presionada es un caracter ASCII su valor será guardado en el registro AH, de lo contrario el código de barrido será guardado en AL y AH contendrá el valor 00H.
El código de barrido fué creado para manejar las teclas que no tienen una representación ASCII como [ALT], [CONTROL], las teclas de función, etc.
Al leer esto que encontre, entendi que en AL, se guardaria el VALOR EN ASCII DEL CARACTER QUE TECLEARA, POR EJEMPLO, si teclaba "A", en "AL" se guardaba el 65, y entonces asi podria desplegar AL para que me desplegara en 65.
entendi mal?¨o se puede?
-
Si, entendiste mal. El valor ASCII es 65 y a su vez es 'A' y la 21h muestra el valor en ASCII de cada caracter. Para desplegar 65 tenes que poner '6' y '5'. Lo que serian dos caracteres ASCII y no uno.
-
Pues muchas gracias Eternal Idol
Pues tendre que seguir en busca de la forma en que cuando presione una tecla, tambien me despliegue su valor en ASCII, osea el 65, 66, etc.
A seguir buscando, y gracias Eternal Idol