Programación General > ASM (Ensamblador)
Com1. Ensamblador
Toph:
--- Citar --- al verdad que me ha sido muy util, pero no estoy con la certeza, o mas bien estoy con muchas dudas... la verdad se que es mucho pedir, pero me estoy enredando solo, podrian escribir un pequeñito codigo de como programar el pto serie y enviar un dato por el?? se los agradeceria un mundo ya que aun sigo perdido sobre como hacerlo unsure.gif sad.gif
muchas gracias anticipadas.
--- Fin de la cita ---
:huh: pues Radoslav y yo pusimos las rutinas de configuracion y envio, la duda que a mi me surgio es que tu dijiste que usabas instrucciones IN y OUT y numeros de puerto, y yo nunca las he utilizado por eso te pregunte para que microprocesador estabas trabajando yo pienso que quiza ahi esta la diferencia o talvez hay dos formas de hacerlo con IN Y OUT y con la INT14 y funciones, no se.
saludos :hola:
guiweb:
mira, esto es lo que llevo hecho de mi programa, aun no está listo, asi que si ven alguna barbaridad, no se enoje :D
--- Código: Text --- STACK SEGMENT STACK STACK ENDS DATA SEGMENT letra dw 1 letra_ok db 1 cont db 5 DATA ENDS ;Definicion de macros a utilizar;///////////////////////////////////////////////////////////////PONVECTOR MACRO TIPO, SUBRUTINA push di mov di,0 mov es,di mov di, tipo*4 cli mov word ptr es:[di],offset subrutina mov word ptr es:[di+2],seg subrutina sti pop diENDM GUARDAVECTOR MACRO TIPO, VIEJOIP, VIEJOCS mov di,0 mov es,di mov di, tipo*4 cli mov ax,data mov ds,ax mov ax,es:[di] mov VIEJOIP,ax mov ax,es:[di+2] mov VIEJOCS,ax stiENDM RESTAURAVECTOR MACRO TIPO, VIEJOIP, VIEJOCS mov di,0 mov es,di mov di, tipo*4 cli mov ax,data mov ds,ax mov ax,VIEJOCS mov es:[di+2],ax mov ax,VIEJOIP mov es:[di],ax stiENDM CODE SEGMENT MiProg proc FAR assume cs:code,ds:data mov ax,data mod ds,ax;Inhabilito interrupcion cli ;////////// PROGRAMACION DEL PUERTO SERIE////////////////////////// ;;;;;;;;;;;;;;;;;;;;;;;;;; Registro de línea de control Mov Dx,3FBH Mov AL,10000000b Out Dx, AL ;;;;;;;;;;;;;;;;;;;;;;;;;; Divisor de la veloidad en bauidos (byte alto) Mov DX,3F9H Mov AL,0 Out Dx, AL ;;;;;;;;;;;;;;;;;;;;;;;;;; Divisor de la velocidad en baudios (byte bajo) Mov Dx,3F8H Mov AL,12H Out DX,AL ;;;;;;;;;;;;;;;;;;;;;;;;;; Longuitud de los caracteres los bits 0 y 1 deben estar en 1para que sea de 8 bit Mov AL,00000011b Mov DX,3FBH Out DX, AL Mov DX,3FCH;INSTRUCCION DEL PROFE Mov AL,8d Out DX,AL ;;;;;;;;;;;;;;;;;;;;;;;;;; Guardamos el puerto Mov DX,3F8H IN AL,DX;;;;;;;;;;;;;;;;;leo que es lo que me llega por el puerto ;//////////////////////////// GUARDAVECTOR 8, VIEJOIP8, VIEJOCS8 PONVECTOR 8, envia PONVECTOR 9, recibe ;Desenmascaro la IRQ4 in al,21h ;Leo el regístro de mascara and al,11101111b ;Solo altero el bit 5 perteneciente a la IRQ4 out 21h,al ;Modifico el registro de mascara con el IRQ4 desenmascarado ;Habilito interrupcion sti CMP letra_ok,1 AA1: MOV AH,01h ; ACA HAGO TODO LO NECESARIO PARA PODER IMPRIMIR UN CARACTER EN PANTALLA INT 21h MOV CL,AL MOV CONT,1 JMP AA1 aqui: cmp fin,1 jne aqui RESTAURAVECTOR 8, VIEJOIP8, VIEJOCS8 ;Enmascaro la IRQ4 en el controlador de interrupciones, y la restauro in al,21h or al,0001 0000 out 21h,al mov ax,4c00h int 21h ;/////////INTERRUPICON PARA RECIBIR////////////recibe: push ax push dx push ds mov ax,data mov ds,ax mov al,20h out 20h,al pod ds pop dx pop ax IRET ;////////INTERRUPCION PARA ENVIAR////////////envia: recibe: push ax push dx push ds mov ax,data mov ds,ax Mov DX,3F8H OUT DX,CL;;;;;;;;;;;;;;;;; ACA TENGO GUARDADO EL DATO QUE VIENE DESDE TECLADO mov al,20h out 20h,al pod ds pop dx pop ax IRET;//////////////////////////// MiProg ENDPCODE ENDSEND MiProg bueno, eso es lo que llevo, Saludos
Bicholey:
:P :P
Yo creo que antes de discutir cualquier cosa aun no no has aclarado sobre que estas trabajando, es decir el programa es para una pc para un micro para un sistema minimo no se en fin deberias aclarar ese punto lo considero necesario
yo tengo unos 3 o 4 archivos que trabajan ptos serie son para usar el pto serie de una pc es decir COM1
.
guiweb:
--- Cita de: "Radoslav" --- :P :P
Yo creo que antes de discutir cualquier cosa aun no no has aclarado sobre que estas trabajando, es decir el programa es para una pc para un micro para un sistema minimo no se en fin deberias aclarar ese punto lo considero necesario
yo tengo unos 3 o 4 archivos que trabajan ptos serie son para usar el pto serie de una pc es decir COM1
.
--- Fin de la cita ---
Estimadicimo, usted tiene toda la santa razon.
Estoy trabajando para usar el puerto serie (com1) de un PC, la idea del chat es conectar por com1 con los pines 2-3,3-2, 5-5 del puerto 2 PC's y por DOS chatear un poco, estoy trabajando sobre un AMD sempron 3100 con windows XP pro.
bueno parece que ahora si avance algo y me siento feliz conmigo mismo, vean el codigo que les dejo, y si alguien puede probarlo, se los agradecerían un monton.
--- Código: Text --- STACK SEGMENT STACK STACK ENDS DATA SEGMENT letra_enviada db 1 letra_recibida db 1 letra_enviada_ok db 1 letra_recibida_ok db 1 viejoip8 dw 0 viejocs8 dw 0 contador_fin dw 500 DATA ENDS ;Definicion de macros a utilizar;///////////////////////////////////////////////////////////////PONVECTOR MACRO TIPO, SUBRUTINA push di mov di,0 mov es,di mov di, tipo*4 cli mov word ptr es:[di],offset subrutina mov word ptr es:[di+2],seg subrutina sti pop diENDM GUARDAVECTOR MACRO TIPO, VIEJOIP, VIEJOCS mov di,0 mov es,di mov di, tipo*4 cli mov ax,data mov ds,ax mov ax,es:[di] mov VIEJOIP,ax mov ax,es:[di+2] mov VIEJOCS,ax stiENDM RESTAURAVECTOR MACRO TIPO, VIEJOIP, VIEJOCS mov di,0 mov es,di mov di, tipo*4 cli mov ax,data mov ds,ax mov ax,VIEJOCS mov es:[di+2],ax mov ax,VIEJOIP mov es:[di],ax stiENDM CODE SEGMENT MiProg proc FAR assume cs:code,ds:data mov ax,data mov ds,ax;Inhabilito interrupcion cli ;////////// PROGRAMACION DEL PUERTO SERIE////////////////////////// ;;;;;;;;;;;;;;;;;;;;;;;;;; Registro de línea de control Mov Dx,3FBH Mov AL,10000000b Out Dx, AL ;;;;;;;;;;;;;;;;;;;;;;;;;; Divisor de la veloidad en bauidos (byte alto) Mov DX,3F9H Mov AL,0 Out Dx, AL ;;;;;;;;;;;;;;;;;;;;;;;;;; Divisor de la velocidad en baudios (byte bajo) Mov Dx,3F8H Mov AL,60H Out DX,AL ;;;;;;;;;;;;;;;;;;;;;;;;;; Longuitud de los caracteres los bits 0 y 1 deben estar en 1para que sea de 8 bit Mov AL,00000011b Mov DX,3FBH Out DX, AL Mov DX,3FCH;INSTRUCCION DEL PROFE Mov AL,8d Out DX,AL ;;;;;;;;;;;;;;;;;;;;;;;;;; Guardamos el puerto Mov DX,3F8H IN AL,DX;;;;;;;;;;;;;;;;;leo que es lo que me llega por el puerto ;//////////////////////////// GUARDAVECTOR 8, VIEJOIP8, VIEJOCS8 PONVECTOR 8, envia PONVECTOR 9, recibe ;Desenmascaro la IRQ4 in al,21h ;Leo el regístro de mascara and al,11101111b;Solo altero el bit 5 perteneciente a la IRQ4 out 21h,al ;Modifico el registro de mascara con el IRQ4 desenmascarado ;Habilito interrupcion stiespera: CMP contador_fin,0 JE salir_programa;;;;;;;;;;;;;;;;;;;;;;;;;Ahora, voy a verificar si tengo alguna nueva letra CMP letra_recibida_ok,1 JNE escribe MOV AH,09h ;;;; si tengo una nueva letra, la cargo en dx, y la muestro en pantalla. LEA DX,letra_recibida ;;;;;;;;;;;;Con esta funcion, se escribe un caracter en pantalla y se guarda en al INT 21h MOV letra_recibida_ok,0 JMP escribe escribe: CMP letra_enviada_ok,1;una vez que se haya enviado la letra, dejo el valor en 1, para que pueda enviar otra JNE decrementa CMP contador_fin,0 CMP letra_enviada,1 JNE decrementa JE salir_programa MOV ah,01h INT 21h MOV letra_enviada,al MOV letra_enviada_ok,0;con esto digo que he escrito una letra y que está lista para ser enviada JMP decrementa decrementa: DEC contador_fin JNZ espera ;;;;; aca itero, para ver si he recibido una letra o si envie una letra. JMP salir_programa RESTAURAVECTOR 8, VIEJOIP8, VIEJOCS8 ;Enmascaro la IRQ4 en el controlador de interrupciones, y la restauro in al,21h xor al,00010000b out 21h,al salir_programa: mov ax,4c00h int 21h ;/////////INTERRUPICON PARA RECIBIR////////////recibe: push ax push dx push ds mov ax,data mov ds,ax mov dx,3f8h in al,dx jz sale_recibe mov letra_recibida,al mov letra_recibida_ok,1 mov contador_fin,500 jmp sale_recibe sale_recibe: mov al,20h out 20h,al pop ds pop dx pop ax IRET ;////////INTERRUPCION PARA ENVIAR////////////envia: push ax push dx push ds mov ax,data mov ds,ax CMP letra_enviada_ok,0 JNE sale_envia Mov DX,3F8H MOV al,letra_enviada OUT DX,al;;;;;;;;;;;;;;;;; ACA TENGO GUARDADO EL DATO QUE VIENE DESDE TECLADO MOV letra_enviada_ok,1 mov contador_fin,500 jmp sale_envia sale_envia: mov al,20h out 20h,al pop ds pop dx pop ax IRET;//////////////////////////// MiProg ENDPCODE ENDSEND MiProg por lo pronto, no es nada espectacular, estoy en el trabajo y no lo he podido probar ya que no tengo mi cable aqui, pero espero que alguien lo pueda probar y que me cuente jejej GRANDE OTTO PETERSEN (mi profe)
EDITADO POR MII
bueno parece que me emocione un poco, la verdad es que todo este codigo no hace nada :blink: solo muestra un monton de basura, no lo habia podido probar, ya que mi notebook no tiene puerto seria :P bueno la cosa es que muestra solo basura y se cierra enseguida, a que se puede deber?? :scream: :alien: :ph34r:
Bicholey:
el codigo como tal parece no tener errores, pero las instrucciones in y out no se acostumbra usarlas en el PC lo cual no quiere decir que no funcione adecuadamente , primeramente deberias asegurar que la direccion que le estas dando como tu puerto COM1 sea la adecuada y que los dos puerto com1 de las dos maquinas que quieres intercomunicar esten empatados de tener complicaciones yo recomendaria el uso de los servicios de la int 14 pero de estar restringido, todo se soluciuonan haciendo pruebas, yo hice el chat que dices pero con turbo C y ASM mezclado deja lo busco y te lo paso para que lo que veas
ok
?
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa