Programación General > ASM (Ensamblador)

 Com1. Ensamblador

<< < (5/7) > >>

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&#59;Inhabilito interrupcion  cli ;////////// PROGRAMACION DEL PUERTO SERIE////////////////////////// &#59;;;;;;;;;;;;;;;;;;;;;;;;;; Registro de línea de control  Mov Dx,3FBH  Mov AL,10000000b  Out Dx, AL  &#59;;;;;;;;;;;;;;;;;;;;;;;;;; Divisor de la veloidad en bauidos (byte alto)   Mov DX,3F9H  Mov AL,0  Out Dx, AL  &#59;;;;;;;;;;;;;;;;;;;;;;;;;; Divisor de la velocidad en baudios (byte bajo)  Mov Dx,3F8H  Mov AL,12H   Out DX,AL  &#59;;;;;;;;;;;;;;;;;;;;;;;;;; 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&#59;INSTRUCCION DEL PROFE  Mov AL,8d  Out DX,AL &#59;;;;;;;;;;;;;;;;;;;;;;;;;; Guardamos el puerto  Mov DX,3F8H   IN AL,DX&#59;;;;;;;;;;;;;;;;;leo que es lo que me llega por el puerto     ;////////////////////////////        GUARDAVECTOR 8, VIEJOIP8, VIEJOCS8        PONVECTOR 8, envia  PONVECTOR 9, recibe           &#59;Desenmascaro la IRQ4  in al,21h        &#59;Leo el regístro de mascara  and al,11101111b &#59;Solo altero el bit 5 perteneciente a la IRQ4  out 21h,al       &#59;Modifico el registro de mascara con el IRQ4 desenmascarado  &#59;Habilito interrupcion  sti  CMP letra_ok,1      AA1: MOV AH,01h  &#59; 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 &#59;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&#59;;;;;;;;;;;;;;;;; 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&#59;Solo altero el bit 5 perteneciente a la IRQ4  out 21h,al      &#59;Modifico el registro de mascara con el IRQ4 desenmascarado  ;Habilito interrupcion  stiespera:  CMP contador_fin,0  JE  salir_programa&#59;;;;;;;;;;;;;;;;;;;;;;;;;Ahora, voy a verificar si tengo alguna nueva letra  CMP letra_recibida_ok,1  JNE escribe  MOV AH,09h    &#59;;;; 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  &#59;;;;; 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

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa