Programación General > ASM (Ensamblador)

 Com1. Ensamblador

<< < (6/7) > >>

guiweb:

--- Cita de: "Radoslav" --- 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
 ?
--- Fin de la cita ---
ok muchas gracias, te cuento que el codigo que subi, solo muestra basura y se cierra inmediatamente... cosa rara, espero poder ver tu codigo y asi entender un poquito mas,

VAMOS VAMOS QUE SE PUEDE :D ;)  :D

Bicholey:
Bueno este es el codigo se compila en turbo C , aclaro este no es mio me lo encontre por ahi , el que yo tengo escanea los puertos UART _USART y bueno en fin esta un poco muy loco y creo que entenderas mejor este .



--- Código: Text --- #include&#60;conio.h&#62;#include&#60;stdlib.h&#62;#include&#60;dos.h&#62;#include&#60;io.h&#62;#include&#60;stdio.h&#62;#include&#60;alloc.h&#62;/*definimos el valor que toman los puertos*/#define COM1 0#define COM2 1 /*definimos las distintas velocidades de trasmision*/#define bd_110 0#define bd_150 32#define bd_300 64#define bd_600 96#define bd_1200 128#define bd_2400 160#define bd_4800 192#define bd_9600 224 /*definimos los valores para los bits de datos*/#define bitd_7 2#define bitd_8 3 /*definimos los valores para los bits de stop*/#define bits_1 0#define bits_2 4 /*definimos los valores para la paridad*/#define nula 0#define impar 8#define par 24 void inicializar(int,int,int,int,int);unsigned char compruebo(int);void leer_car(unsigned char *,int);void enviar_car(unsigned char,int); void main(void){unsigned char let,car,bytel;clrscr();inicializar(COM1,bd_9600,impar,bits_1,bitd_8);while (let!=27)   {   if (compruebo(COM1)&1) //comprobamos si el bit 0 del valor retornado      {                   //es 1      leer_car(&car,COM1);      if (car!=0)        {         if (car=='&#092;r') car='&#092;n';         printf(&#34;%c&#34;,car);        }        car=0;        enviar_car(0,COM1);      }      if (kbhit())      {      let=getch();      if (let!=27)         {           enviar_car(let,COM1);         }      }   }}void inicializar(int puerto,int baudios,int paridad,int b_stop,int b_datos){unsigned char total;//sumaremos los par metros de inicializacion      total=baudios+paridad+b_stop+b_datos;asm {          //inicilizamos el puerto      mov ah,0h   //el servicio uh nos permite inicializar el puerto      mov dx,puerto //pasamos el puerto a 'dx'      mov al,total //pasamos la suma de los parametros a 'al'      int 14h //solicitamos la interrupcion 14h      } }unsigned char compruebo(int puerto){unsigned char com;asm { //estado del puerto     mov ah,3h //el servicio 3h comprueba el estado del puerto     mov dx,puerto //pasamos el puerto a 'dx'     int 14h //solicitamos la interrupcion 14h     mov com,ah //codigo de error retornado a 'ah' y pasado a 'com'   }   return com;}void leer_car(unsigned char *caracter, int puerto){   unsigned char letra;   asm{    //recoge un caracter     mov ah,2h      //el servicio 2h nos permite recoger un caracter     mov dx,puerto //pasamos el puerto a DX     int 14h   //solicitamos la interrupcion 14h     mov letra,al //el caracter es retornado a 'al' y la pasamos a letra      }      *caracter=letra;}void enviar_car(unsigned char caracter, int puerto)   {   asm{    //envia un caracter        mov ah,1h   //el servicio 1h nos permite enviar un caracter        mov dx,puerto //pasamos el puerto a DX        mov al,caracter   //pasamos el caracter a 'al'        int 14h   //solicitamos la interrupcion 14h     }   }   
espero te sirva y si tienes dudas me puedes preguntar.

guiweb:
Gracias por tu ayuda, la verdad es que me he propuesto hacerlo solo con ASM, mira adelante un poco el codigo y segun yo, deberia estar funcionando correctamente, pero lo probe con 2 computadores y no funciono, mira te muestro el Codigo Completo..
bueno y espero que le sirva a algun estudiante por ahi que este desesperado buscandolo jejeje
es un chat que recibe por interrupcion, a traves de puerto serie..
Bicholey , amigo te pido porfavor si puedes probarlo y ver si a ti te funciona, muchas gracias

--- Código: Text --- STACK SEGMENT STACK   db 256 dup (0)STACK ENDS DATA SEGMENT  copyrigth db 'Programa Desarrollado por Guillermo Stortoni y Hernan Escalante, UCINF 2006',13,'&#036;' letra_enviada db 1 letra_recibida db 1 letra_enviada_ok db 1 letra_recibida_ok db 1 ren_limpio_rec db 1 ren_limpio db 1 renglon_limpio db '                                                                              ',13,'&#036;' renglon_envia db 5 renglon_recibe db 5 columna_envia db 5 columna_recibe db 5 viejoip8 dw 0 viejocs8 dw 0 cartel1 db '...Me estan Diciendo:',10,13,'&#036;' cartel2 db '...Estoy Escribiendo:',10,13,'&#036;' intro db 10,'&#036;'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  &#59;inicializo la variable letra_recibida_ok con un 0, para iniciar la transmision.  mov letra_recibida_ok,0  mov renglon_recibe,1  mov renglon_envia,13  mov columna_envia,0  mov columna_recibe,0  mov ren_limpio,0  mov ren_limpio_rec,0 &#59;limpio la pantalla :D  mov ax,0600h  mov bh,17h  mov cx,0000h  mov dx,184fh  int 10h &#59;muevo el cursor a la posicion renglon 0, columna 1: con el mensaje &#34;aca se recibe&#34;&#59;)  MOV ah,02h  MOV bh,00h  MOV dh,00  MOV dl,01  INT 10h  lea dx,cartel1  mov ah,09h  int 21h &#59;muevo el cursor a la posicion renglon 12, columna 1: con el mensaje &#34;aca se envia&#34;&#59;)  MOV ah,02h  MOV bh,00h  MOV dh,12  MOV dl,01  INT 10h  lea dx,cartel2  mov ah,09h  int 21h &#59; pongo el copyrigth  MOV ah,02h  MOV bh,00h  MOV dh,24  MOV dl,00  INT 10h  lea dx,copyrigth  mov ah,09h  int 21h &#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&#59;;;;;;;;;;;;;;;;;;;;;;;;;; INSTRUCCION DEL PROFE  Mov DX,3FCH  Mov AL,03h  Out DX,AL&#59;;;;;;;;;;;;;;;;;;;;;;;;;; Habilito dicho por el profe  Mov DX,3F9H  Mov AL,1  Out Dx, AL  ;////////////////////////////  GUARDAVECTOR 8, VIEJOIP8, VIEJOCS8  PONVECTOR 12, 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  jmp escribe  &#59;######################### ACA RECIBO, MUESTRO EN PANTALLA Y ACTUALIZO EL RENGLON ########################## &#59;#                                                                                                         # &#59;#                                                                                                         #  recibir: MOV ah,02h     &#59;peticion para colocar el cursor  MOV bh,00h              &#59;numero de pagina 0  MOV dh,renglon_recibe   &#59;la ultima posicion donde se escribio una letra  MOV dl,columna_recibe   &#59;la columna, la incrementa automaticamente la interrupcion RECIBE  INT 10h  CMP letra_recibida,0Dh  &#59;me llego un enter?  JNE sigue  mov columna_recibe,0  cmp renglon_recibe,9  jne sigue  mov ren_limpio_rec,1  mov renglon_recibe,1  jmp siguesigue: cmp ren_limpio_rec,1  jne continua  lea dx,renglon_limpio  mov ah,09h  int 21h  jmp continuacontinua:  mov dl,letra_recibida  MOV ah,06h             &#59; la funcion 06h, me sirve para mostrar 1 caracter  INT 21h  MOV letra_recibida_ok,0  INC columna_recibe  JMP escribe   &#59;######################### ACA ESCRIBO Y ENVIO POR PUERTO ########################## &#59;# &#59;#  escribe:  CMP letra_recibida_ok,1&#59; si la interrupcion hizo que me cayera una letra, dejo que se escriba la letra que llego  je recibir            &#59;le doy la posibilidad de que la escriba, antes de yo seguir escribiendo  MOV ah,02h           &#59;peticion para colocar el cursor  MOV bh,00h           &#59;numero de pagina 0  MOV dh,renglon_envia &#59;uso el ultimo renglon que me quedo, para seguir escribiendo en la misma posicion&#59;)  MOV dl,columna_envia &#59;uso la ultima columna que me quedo, para seguir escribiendo en la misma posicion&#59;)  INT 10h              &#59;interrupcion del bios  CMP ren_limpio,1     &#59;esta variable, si esta en 1, me indica que ya he escrito 10 renglones, por lo tanto borra el primer renglon  jne repite           &#59;si no he escrito aun 10 renglones, sigue con el codigo normalmente  lea dx, renglon_limpio;si no es asi, borra el primer renglon utilizado para poder escribir libremente  mov ah,09h           &#59;muestra el '             '  int 21h              &#59;DOS  repite: MOV ah,01h   &#59;pido solo 1 caracter el cual se despliega en pantalla y se guarda en al  INT 21h              &#59;DOS  cmp al,1Bh           &#59;comparo si el caracter presionado es 'esc' si es asi, se terminará el programa, de lo contrar continua  je salir_programa     &#59; esta esta clara cierto?  MOV letra_enviada,al &#59;guardo la tecla presionada en la variable tecla_enviada  MOV letra_enviada_ok,0&#59;con esto pongo una bandera de que he escrito una letra  MOV DX,0000           &#59;puerto COM1  MOV AH,01             &#59; funcion 01h-enviando un caracter al COM  MOV AL,letra_enviada  &#59;caracter a ser enviado  INT 14 &#59;MOV dx,3F8h           &#59; llamo al puerto COM1 &#59;out dx,al             &#59; escribo el caracter presionado por el puerto  inc columna_envia     &#59; si escribi una tecla, debo moverme un espacio, para eso incremento la columna  cmp letra_enviada,0dh &#59;comparo si la tecla presionada fue enter, de ser asi, necesitare hacer un salto de linea  jne repite            &#59;sino, sigue escribiendo  mov columna_envia,0   &#59;si aprete enter, retorno el carro  inc renglon_envia     &#59;salto 1 renglon  lea dx,intro          &#59;cargo un mensaje que lo unico que tiene es 1 espacio vacio  mov ah,09h            &#59;lo muestro en pantalla  int 21h               &#59;DOS  cmp renglon_envia,23  &#59;esto es para contar si ya mi cursor esta en el renglon 23  je  mod_renglon_envia &#59;y si es asi, lo reinicio al 13  jne escribe           &#59; sino, sigo escribiendomod_renglon_envia: mov renglon_envia,13  mov ren_limpio,1       &#59;pongo una bandera avisando que y he escrito 23 renglones  jmp escribe             &#59;sigo escribiendo  RESTAURAVECTOR 8, VIEJOIP8, VIEJOCS8 ;Enmascaro la IRQ4 en el controlador de interrupciones, y la restauroin al,21hor al,00010000bout 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  mov letra_recibida,al  mov letra_recibida_ok,1  inc renglon_recibe  mov al,20h  out 20h,al   pop ds  pop dx  pop ax      IRET  MiProg ENDPCODE ENDSEND MiProg  

Bicholey:
:unsure:  :unsure:


Pues lo he probado pero no me funciono de igual manera, ahora he tenido mucho trabajo pero cuando tengo un tiempo me dare un tiempo para revisarlo más a fondo.

guiweb:
bueno el plazo ya se me acabo y el programa lo tuve que entregar, la buena noticia es que TENGO HECHO EL CHAT EN ASSEMBLER CON INTERRUPCIONES :D que super bueno, tiene un pequeño detalle que es cuando me llegan los caracteres despues el cursor no regresa a la zona de escritura, por lo que debo arreglar este inconveniente y listo :D.

Gracias por su ayuda y en especial a Bicholey, te pasaste amigo muchas gracias

Cualquier cosa si alguien lo quiere, es cosa que deje el pedido aca en el foro, yo voy a seguir perfeccionandolo para lanzarlo a la web...

Saludos

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa