Programación General > ASM (Ensamblador)
Com1. Ensamblador
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<conio.h>#include<stdlib.h>#include<dos.h>#include<io.h>#include<stdio.h>#include<alloc.h>/*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=='\r') car='\n'; printf("%c",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,'$' 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,'$' 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,'$' cartel2 db '...Estoy Escribiendo:',10,13,'$' intro db 10,'$'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 ;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 ;limpio la pantalla :D mov ax,0600h mov bh,17h mov cx,0000h mov dx,184fh int 10h ;muevo el cursor a la posicion renglon 0, columna 1: con el mensaje "aca se recibe";) MOV ah,02h MOV bh,00h MOV dh,00 MOV dl,01 INT 10h lea dx,cartel1 mov ah,09h int 21h ;muevo el cursor a la posicion renglon 12, columna 1: con el mensaje "aca se envia";) MOV ah,02h MOV bh,00h MOV dh,12 MOV dl,01 INT 10h lea dx,cartel2 mov ah,09h int 21h ; 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 ;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;;;;;;;;;;;;;;;;;;;;;;;;;; INSTRUCCION DEL PROFE Mov DX,3FCH Mov AL,03h Out DX,AL;;;;;;;;;;;;;;;;;;;;;;;;;; Habilito dicho por el profe Mov DX,3F9H Mov AL,1 Out Dx, AL ;//////////////////////////// GUARDAVECTOR 8, VIEJOIP8, VIEJOCS8 PONVECTOR 12, 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 jmp escribe ;######################### ACA RECIBO, MUESTRO EN PANTALLA Y ACTUALIZO EL RENGLON ########################## ;# # ;# # recibir: MOV ah,02h ;peticion para colocar el cursor MOV bh,00h ;numero de pagina 0 MOV dh,renglon_recibe ;la ultima posicion donde se escribio una letra MOV dl,columna_recibe ;la columna, la incrementa automaticamente la interrupcion RECIBE INT 10h CMP letra_recibida,0Dh ;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 ; la funcion 06h, me sirve para mostrar 1 caracter INT 21h MOV letra_recibida_ok,0 INC columna_recibe JMP escribe ;######################### ACA ESCRIBO Y ENVIO POR PUERTO ########################## ;# ;# escribe: CMP letra_recibida_ok,1; si la interrupcion hizo que me cayera una letra, dejo que se escriba la letra que llego je recibir ;le doy la posibilidad de que la escriba, antes de yo seguir escribiendo MOV ah,02h ;peticion para colocar el cursor MOV bh,00h ;numero de pagina 0 MOV dh,renglon_envia ;uso el ultimo renglon que me quedo, para seguir escribiendo en la misma posicion;) MOV dl,columna_envia ;uso la ultima columna que me quedo, para seguir escribiendo en la misma posicion;) INT 10h ;interrupcion del bios CMP ren_limpio,1 ;esta variable, si esta en 1, me indica que ya he escrito 10 renglones, por lo tanto borra el primer renglon jne repite ;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 ;muestra el ' ' int 21h ;DOS repite: MOV ah,01h ;pido solo 1 caracter el cual se despliega en pantalla y se guarda en al INT 21h ;DOS cmp al,1Bh ;comparo si el caracter presionado es 'esc' si es asi, se terminará el programa, de lo contrar continua je salir_programa ; esta esta clara cierto? MOV letra_enviada,al ;guardo la tecla presionada en la variable tecla_enviada MOV letra_enviada_ok,0;con esto pongo una bandera de que he escrito una letra MOV DX,0000 ;puerto COM1 MOV AH,01 ; funcion 01h-enviando un caracter al COM MOV AL,letra_enviada ;caracter a ser enviado INT 14 ;MOV dx,3F8h ; llamo al puerto COM1 ;out dx,al ; escribo el caracter presionado por el puerto inc columna_envia ; si escribi una tecla, debo moverme un espacio, para eso incremento la columna cmp letra_enviada,0dh ;comparo si la tecla presionada fue enter, de ser asi, necesitare hacer un salto de linea jne repite ;sino, sigue escribiendo mov columna_envia,0 ;si aprete enter, retorno el carro inc renglon_envia ;salto 1 renglon lea dx,intro ;cargo un mensaje que lo unico que tiene es 1 espacio vacio mov ah,09h ;lo muestro en pantalla int 21h ;DOS cmp renglon_envia,23 ;esto es para contar si ya mi cursor esta en el renglon 23 je mod_renglon_envia ;y si es asi, lo reinicio al 13 jne escribe ; sino, sigo escribiendomod_renglon_envia: mov renglon_envia,13 mov ren_limpio,1 ;pongo una bandera avisando que y he escrito 23 renglones jmp escribe ;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
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa