Foros del Web » Programación para mayores de 30 ;) » Programación General »

duda con ASSEMBLER y MASM

Estas en el tema de duda con ASSEMBLER y MASM en el foro de Programación General en Foros del Web. Hola que tal.... tengo el siguiente problema, quiero mostrar por pantalla un digito que presione en el teclado. el digito en cuestion es el 5 ...
  #1 (permalink)  
Antiguo 20/06/2005, 23:31
 
Fecha de Ingreso: septiembre-2004
Ubicación: Santiago de Chile
Mensajes: 156
Antigüedad: 20 años, 2 meses
Puntos: 0
duda con ASSEMBLER y MASM

Hola que tal.... tengo el siguiente problema, quiero mostrar por pantalla un digito que presione en el teclado.
el digito en cuestion es el 5 y este es parte del codigo que tengo.... declare para usar una pila, la verdad es que soy novatisimo en esto.. y me gustaria que me dijeran cuales son todos mis errores.. aqui va el codigo que tengo hasta ahora:

PILA SEGMENT STACK
DB 256 DUP ("PILA")
PILA ENDS

CODIGO SEGMENT
ASSUME CS:CODIGO,SS:PILA
MAIN PROC
NOP
NOP
NOP
MOV DX,0378h
MOV AX,0000h
OUT DX,AX
CALL RECUPERA
CALL ESCRIBE
RET
MAIN ENDP


RECUPERA PROC
MOV AX,0000h ;vuelvo 0 AX
INT 16h ; Guardo en AX el valor presionado
MOV CX,0635h ; muevo mi 5 a cx
CMP CX,AX ; lo comparo con el digito marcado en teclado
JNE RECUPERA ; si no son iguales que vuelva a hacer todo el control
RET
RECUPERA ENDP
;---------------------------------------
;**ESCRIBE EN PANTALLA EL DIGITO EN AX**
;---------------------------------------
ESCRIBE PROC
MOV AH,09h ; \
INT 10h ; \ ESTE ES MI PROBLEMA.
OUT CX,AX ; /
RET ; /
ESCRIBE ENDP
CODIGO ENDS
END MAIN
;-------------------------------



si alguien me pudiera ayudar.... estare eternamente agradecido.
  #2 (permalink)  
Antiguo 21/06/2005, 01:18
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
No tengo MASM 16 aca asi que todo esto es en teoria, vamos por partes:

Código:
MOV DX,0378h
MOV AX,0000h
OUT DX,AX
Esto no tiene nada que ver, es para enviar un byte al puerto paralelo sino me equivoco.

Código:
RECUPERA PROC
MOV AX,0000h ;vuelvo 0 AX
INT 16h ; Guardo en AX el valor presionado
MOV CX,0635h ; muevo mi 5 a cx
CMP CX,AX ; lo comparo con el digito marcado en teclado
JNE RECUPERA ; si no son iguales que vuelva a hacer todo el control
RET
RECUPERA ENDP
¿MOV CX,0635h ; muevo mi 5 a cx? ¿Porque no comparar contra el '5' que es 035h y esta en AL?

http://www.ctyme.com/intr/rb-1754.htm

Return:AH = BIOS scan code
AL = ASCII character

Código:
ESCRIBE PROC
MOV AH,09h ; \
INT 10h ; \ ESTE ES MI PROBLEMA. 
OUT CX,AX ; /
RET ; /
ESCRIBE ENDP
CODIGO ENDS
END MAIN
Esto ultimo esta equivocado, mira la pagina que te dejo http://www.ctyme.com/intr/rb-0099.htm, te faltan varios parametros por especificarle a la funcion y creo que deberias utilizar alguna mas facil de ser posible como por ejemplo esta: http://www.ctyme.com/intr/rb-2558.htm

¿OUT CX,AX? ¿Porque haces eso?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 21/06/2005, 12:21
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Para escribe podes usar esto:

Código:
ESCRIBE PROC
mov ah, 06h
mov dl, 035h
int 021h
ret
ESCRIBE ENDP
Y no te olvides de salir a MS-DOS en el main:

Código:
mov ah, 04Ch
int 021h
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #4 (permalink)  
Antiguo 21/06/2005, 21:06
 
Fecha de Ingreso: septiembre-2004
Ubicación: Santiago de Chile
Mensajes: 156
Antigüedad: 20 años, 2 meses
Puntos: 0
Ok ahora hice los cambios que tu me dices, y me muestra el N° 5 en pantalla, pero solo el 5 que esta bajo las F1,F" etc... y luego se cierra automaticamente..... ahora la segunda parte del programa, es que debo sacar este numero por puerta paralela.... sabes que interrupcion debo usar??...
  #5 (permalink)  
Antiguo 22/06/2005, 00:38
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Lo del 5 es por el codigo que pusiste, te lo aclare en el primer mensaje, usa este y te va a funcionar perfectamente con el 5 del teclado alfanumerico por ejemplo:

Código:
RECUPERA PROC
MOV AX,0000h ;vuelvo 0 AX
INT 16h ; Guardo en AX el valor presionado
mov cl, 035h
cmp cl, al
JNE RECUPERA ; si no son iguales que vuelva a hacer todo el control
RET
RECUPERA ENDP
Se cierra porque el programa no tiene nada mas que hacer y debe devolver el control a MS-DOS que es un sistema MONOTAREA.

Creo que estabas bien encaminado en cuanto a los out's pero podes probar con http://www.ctyme.com/intr/int-17.htm
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #6 (permalink)  
Antiguo 22/06/2005, 07:40
 
Fecha de Ingreso: septiembre-2004
Ubicación: Santiago de Chile
Mensajes: 156
Antigüedad: 20 años, 2 meses
Puntos: 0
Maestro... la verdad es que te debo una grande.... ya que mi programa ya esta practicamente listo.... y en gran medida gracias a ti.... ahora voy a seguir probando mi programa y hacer que envie los datos al puerto LPT1. despues te cuento.
  #7 (permalink)  
Antiguo 22/06/2005, 08:32
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
De nadas y me alegro de que te haya servido
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #8 (permalink)  
Antiguo 22/06/2005, 09:42
 
Fecha de Ingreso: septiembre-2004
Ubicación: Santiago de Chile
Mensajes: 156
Antigüedad: 20 años, 2 meses
Puntos: 0
una consulta... sabes que para poder programar me estoy volviendo loko ya que el masm8088 que es el compilador que uso, no funciona en windows XP, y tengo que estar con VMware... emulando windows 2000 y programando ahi..... y como veras no es para nada sencillo... conoces algun compilador para windows XP???? o cual usas tu, pq con este me estoy volviendo loko... muchas gracias
  #9 (permalink)  
Antiguo 22/06/2005, 09:44
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 20 años, 1 mes
Puntos: 3
No se si te pueda servir, pero puedes buscarte el masm32, es bueno y no se si funcione como el masm normal, pero de que se pueden crear cosas un poco mas facil lo creo.
  #10 (permalink)  
Antiguo 22/06/2005, 09:45
 
Fecha de Ingreso: septiembre-2004
Ubicación: Santiago de Chile
Mensajes: 156
Antigüedad: 20 años, 2 meses
Puntos: 0
es que tengo que programar tal como esta en el codigo dejado arriba.. porque mi profe es un hinchapelotas en ese sentido :D gracias.... aaa y ya probe el masm32...
  #11 (permalink)  
Antiguo 22/06/2005, 10:36
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
MASM32 no te sirve para esto ya que ensambla codigo de 32 bits, MASM32 es un paquete que integra el ensamblador de 32 bits + los archivos de include correspondientes (.inc) a los de C (.h) con lo cual tenes las definiciones de las funciones de la API de Windows, estructuras y enumeraciones.

Podes intentar conseguir MASM 16 en estos dos sitios (funciona perfectamente en cualquier version de NT):

http://www.doslife.com/stuff.html

http://usuarios.lycos.es/scratchupload/
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #12 (permalink)  
Antiguo 23/06/2005, 17:27
 
Fecha de Ingreso: septiembre-2004
Ubicación: Santiago de Chile
Mensajes: 156
Antigüedad: 20 años, 2 meses
Puntos: 0
ya señor..... asi quedo mi programita... ahora solo tengo la duda con el procedimiento de IMPRIMIR no estoy seguro que este enviando el digito a la puerta paralela, ya que no tengo como comprobarlo :S bueno baste de chachara y ahi les va el codigo.

PILA SEGMENT STACK
DB 256 DUP ("PILA")
PILA ENDS

CODIGO SEGMENT
ASSUME CS:CODIGO,SS:PILA
MAIN PROC
NOP
NOP
NOP
MOV AX,0000h
CALL RECUPERA
CALL ESCRIBE
CALL IMPRIME
CALL FINALIZA
MOV AH,04Ch
INT 021H
RET
MAIN ENDP


RECUPERA PROC
MOV AX,0000h
INT 16h
MOV CL,032h
CMP CL,AL
JNE RECUPERA
RET
RECUPERA ENDP

ESCRIBE PROC
MOV AH,06h
MOV DL,032h
INT 021h
RET
ESCRIBE ENDP

IMPRIME PROC
MOV AH,00h
MOV AX,0332h
MOV DX,0
INT 17h
RET
IMPRIME ENDP

FINALIZA PROC
MOV AX, 0000h
INT 16h
MOV CX, 1C0Dh
CMP CX,AX
JNE FINALIZA
RET
FINALIZA ENDP
CODIGO ENDS
END MAIN


si alguien me puediera decir si el programa envia este digito ( el 2 ) a la LPT1, se lo agradeceria, ya que tiene que encender un display de 7 segmentos conectado a la paralela. Muchas Gracias por sus respuestas.
  #13 (permalink)  
Antiguo 24/06/2005, 00:14
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
No esta bien porque estas sobreescribiendo la parte del registro que especifica el numero del servicio pedido:

Código:
IMPRIME PROC
MOV AH,00h        ; << Queres acceder al servicio 0
MOV AX,0332h      ; << ¿Ahora queres acceder al servicio 3?
MOV DX,0
INT 17h
RET
IMPRIME ENDP
Lo correcto seria
Código:
MOV AH, 00h
MOV AL, 32h
o tambien
Código:
MOV AX, 032h
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #14 (permalink)  
Antiguo 24/06/2005, 15:02
 
Fecha de Ingreso: septiembre-2004
Ubicación: Santiago de Chile
Mensajes: 156
Antigüedad: 20 años, 2 meses
Puntos: 0
OK muchas Gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:24.