• Lunes 18 de Noviembre de 2024, 03:56

Autor Tema:  Com1. Ensamblador  (Leído 13876 veces)

guiweb

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Com1. Ensamblador
« Respuesta #25 en: Martes 4 de Julio de 2006, 21:32 »
0
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
 ?
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

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Re: Com1. Ensamblador
« Respuesta #26 en: Jueves 6 de Julio de 2006, 20:36 »
0
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
  1.  
  2. #include<conio.h>
  3. #include<stdlib.h>
  4. #include<dos.h>
  5. #include<io.h>
  6. #include<stdio.h>
  7. #include<alloc.h>
  8. /*definimos el valor que toman los puertos*/
  9. #define COM1 0
  10. #define COM2 1
  11.  
  12. /*definimos las distintas velocidades de trasmision*/
  13. #define bd_110 0
  14. #define bd_150 32
  15. #define bd_300 64
  16. #define bd_600 96
  17. #define bd_1200 128
  18. #define bd_2400 160
  19. #define bd_4800 192
  20. #define bd_9600 224
  21.  
  22. /*definimos los valores para los bits de datos*/
  23. #define bitd_7 2
  24. #define bitd_8 3
  25.  
  26. /*definimos los valores para los bits de stop*/
  27. #define bits_1 0
  28. #define bits_2 4
  29.  
  30. /*definimos los valores para la paridad*/
  31. #define nula 0
  32. #define impar 8
  33. #define par 24
  34.  
  35. void inicializar(int,int,int,int,int);
  36. unsigned char compruebo(int);
  37. void leer_car(unsigned char *,int);
  38. void enviar_car(unsigned char,int);
  39.  
  40. void main(void)
  41. {
  42. unsigned char let,car,bytel;
  43. clrscr();
  44. inicializar(COM1,bd_9600,impar,bits_1,bitd_8);
  45. while (let!=27)
  46.    {
  47.    if (compruebo(COM1)&1) //comprobamos si el bit 0 del valor retornado
  48.       {                   //es 1
  49.       leer_car(&car,COM1);
  50.       if (car!=0)
  51.         {
  52.          if (car=='\r') car='\n';
  53.          printf("%c",car);
  54.         }
  55.         car=0;
  56.         enviar_car(0,COM1);
  57.       }
  58.       if (kbhit())
  59.       {
  60.       let=getch();
  61.       if (let!=27)
  62.          {
  63.            enviar_car(let,COM1);
  64.          }
  65.       }
  66.    }
  67. }
  68. void inicializar(int puerto,int baudios,int paridad,int b_stop,int b_datos)
  69. {
  70. unsigned char total;//sumaremos los par metros de inicializacion
  71.       total=baudios+paridad+b_stop+b_datos;
  72. asm {          //inicilizamos el puerto
  73.       mov ah,0h   //el servicio uh nos permite inicializar el puerto
  74.       mov dx,puerto //pasamos el puerto a 'dx'
  75.       mov al,total //pasamos la suma de los parametros a 'al'
  76.       int 14h //solicitamos la interrupcion 14h
  77.       }
  78.  
  79. }
  80. unsigned char compruebo(int puerto)
  81. {
  82. unsigned char com;
  83. asm { //estado del puerto
  84.      mov ah,3h //el servicio 3h comprueba el estado del puerto
  85.      mov dx,puerto //pasamos el puerto a 'dx'
  86.      int 14h //solicitamos la interrupcion 14h
  87.      mov com,ah //codigo de error retornado a 'ah' y pasado a 'com'
  88.    }
  89.    return com;
  90. }
  91. void leer_car(unsigned char *caracter, int puerto)
  92. {
  93.    unsigned char letra;
  94.    asm{    //recoge un caracter
  95.      mov ah,2h      //el servicio 2h nos permite recoger un caracter
  96.      mov dx,puerto //pasamos el puerto a DX
  97.      int 14h   //solicitamos la interrupcion 14h
  98.      mov letra,al //el caracter es retornado a 'al' y la pasamos a letra
  99.       }
  100.       *caracter=letra;
  101. }
  102. void enviar_car(unsigned char caracter, int puerto)
  103.    {
  104.    asm{    //envia un caracter
  105.         mov ah,1h   //el servicio 1h nos permite enviar un caracter
  106.         mov dx,puerto //pasamos el puerto a DX
  107.         mov al,caracter   //pasamos el caracter a 'al'
  108.         int 14h   //solicitamos la interrupcion 14h
  109.      }
  110.    }
  111.  
  112.  
  113.  

espero te sirva y si tienes dudas me puedes preguntar.
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]


guiweb

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Com1. Ensamblador
« Respuesta #27 en: Jueves 6 de Julio de 2006, 22:24 »
0
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
  1.  
  2. STACK SEGMENT STACK
  3.    db 256 dup (0)
  4. STACK ENDS
  5.  
  6. DATA SEGMENT
  7.   copyrigth db 'Programa Desarrollado por Guillermo Stortoni y Hernan Escalante, UCINF 2006',13,'$'
  8.  letra_enviada db 1
  9.  letra_recibida db 1
  10.  letra_enviada_ok db 1
  11.  letra_recibida_ok db 1
  12.  ren_limpio_rec db 1
  13.  ren_limpio db 1
  14.  renglon_limpio db '                                                                              ',13,'$'
  15.  renglon_envia db 5
  16.  renglon_recibe db 5
  17.  columna_envia db 5
  18.  columna_recibe db 5
  19.  viejoip8 dw 0
  20.  viejocs8 dw 0
  21.  cartel1 db '...Me estan Diciendo:',10,13,'$'
  22.  cartel2 db '...Estoy Escribiendo:',10,13,'$'
  23.  intro db 10,'$'
  24. DATA ENDS
  25.  
  26. ;Definicion de macros a utilizar
  27. ;///////////////////////////////////////////////////////////////
  28. PONVECTOR MACRO TIPO, SUBRUTINA
  29.   push di
  30.   mov di,0
  31.   mov es,di
  32.   mov di, tipo*4
  33.   cli
  34.   mov word ptr es:[di],offset subrutina
  35.   mov word ptr es:[di+2],seg subrutina
  36.   sti
  37.   pop di
  38. ENDM
  39.  
  40. GUARDAVECTOR MACRO TIPO, VIEJOIP, VIEJOCS
  41.   mov di,0
  42.   mov es,di
  43.   mov di, tipo*4
  44.   cli
  45.   mov ax,data
  46.   mov ds,ax
  47.   mov ax,es:[di]
  48.   mov VIEJOIP,ax
  49.   mov ax,es:[di+2]
  50.   mov VIEJOCS,ax
  51.   sti
  52. ENDM
  53.  
  54. RESTAURAVECTOR MACRO TIPO, VIEJOIP, VIEJOCS
  55.   mov di,0
  56.   mov es,di
  57.   mov di, tipo*4
  58.   cli
  59.   mov ax,data
  60.   mov ds,ax
  61.   mov ax,VIEJOCS
  62.   mov es:[di+2],ax
  63.   mov ax,VIEJOIP
  64.   mov es:[di],ax
  65.   sti
  66. ENDM
  67.  
  68. CODE SEGMENT
  69.   MiProg proc FAR
  70.   assume cs:code,ds:data
  71.  
  72.    mov ax,data
  73.   mov ds,ax
  74.  
  75.  &#59;inicializo la variable letra_recibida_ok con un 0, para iniciar la transmision.
  76.   mov letra_recibida_ok,0
  77.   mov renglon_recibe,1
  78.   mov renglon_envia,13
  79.   mov columna_envia,0
  80.   mov columna_recibe,0
  81.   mov ren_limpio,0
  82.   mov ren_limpio_rec,0
  83.  &#59;limpio la pantalla :D
  84.   mov ax,0600h
  85.   mov bh,17h
  86.   mov cx,0000h
  87.   mov dx,184fh
  88.   int 10h
  89.  &#59;muevo el cursor a la posicion renglon 0, columna 1: con el mensaje "aca se recibe"&#59;)
  90.   MOV ah,02h
  91.   MOV bh,00h
  92.   MOV dh,00
  93.   MOV dl,01
  94.   INT 10h
  95.   lea dx,cartel1
  96.   mov ah,09h
  97.   int 21h
  98.  &#59;muevo el cursor a la posicion renglon 12, columna 1: con el mensaje "aca se envia"&#59;)
  99.   MOV ah,02h
  100.   MOV bh,00h
  101.   MOV dh,12
  102.   MOV dl,01
  103.   INT 10h
  104.   lea dx,cartel2
  105.   mov ah,09h
  106.   int 21h
  107.  &#59; pongo el copyrigth
  108.   MOV ah,02h
  109.   MOV bh,00h
  110.   MOV dh,24
  111.   MOV dl,00
  112.   INT 10h
  113.   lea dx,copyrigth
  114.   mov ah,09h
  115.   int 21h
  116.  &#59;Inhabilito interrupcion
  117.   cli
  118.  
  119. ;////////// PROGRAMACION DEL PUERTO SERIE//////////////////////////
  120.  
  121. &#59;;;;;;;;;;;;;;;;;;;;;;;;;; Registro de línea de control
  122.   Mov Dx,3FBH
  123.   Mov AL,10000000b
  124.   Out Dx, AL
  125. &#59;;;;;;;;;;;;;;;;;;;;;;;;;; Divisor de la veloidad en bauidos (byte alto)
  126.    Mov DX,3F9H
  127.   Mov AL,0
  128.   Out Dx, AL
  129. &#59;;;;;;;;;;;;;;;;;;;;;;;;;; Divisor de la velocidad en baudios (byte bajo)
  130.   Mov Dx,3F8H
  131.   Mov AL,12H
  132.   Out DX,AL
  133. &#59;;;;;;;;;;;;;;;;;;;;;;;;;; Longuitud de los caracteres los bits 0 y 1 deben estar en 1para que sea de 8 bit
  134.   Mov AL,00000011b
  135.   Mov DX,3FBH
  136.   Out DX, AL
  137. &#59;;;;;;;;;;;;;;;;;;;;;;;;;; INSTRUCCION DEL PROFE
  138.   Mov DX,3FCH
  139.   Mov AL,03h
  140.   Out DX,AL
  141. &#59;;;;;;;;;;;;;;;;;;;;;;;;;; Habilito dicho por el profe
  142.   Mov DX,3F9H
  143.   Mov AL,1
  144.   Out Dx, AL
  145.  
  146. ;////////////////////////////
  147.   GUARDAVECTOR 8, VIEJOIP8, VIEJOCS8
  148.   PONVECTOR 12, recibe
  149.            
  150. &#59;Desenmascaro la IRQ4
  151.   in al,21h        &#59;Leo el regístro de mascara
  152.   and al,11101111b &#59;Solo altero el bit 5 perteneciente a la IRQ4
  153.   out 21h,al       &#59;Modifico el registro de mascara con el IRQ4 desenmascarado
  154.  
  155. &#59;Habilito interrupcion
  156.   sti
  157.   jmp escribe
  158.  
  159.  &#59;######################### ACA RECIBO, MUESTRO EN PANTALLA Y ACTUALIZO EL RENGLON ##########################
  160.  &#59;#                                                                                                         #
  161.  &#59;#                                                                                                         #
  162.   recibir: MOV ah,02h     &#59;peticion para colocar el cursor
  163.   MOV bh,00h              &#59;numero de pagina 0
  164.   MOV dh,renglon_recibe   &#59;la ultima posicion donde se escribio una letra
  165.   MOV dl,columna_recibe   &#59;la columna, la incrementa automaticamente la interrupcion RECIBE
  166.   INT 10h
  167.   CMP letra_recibida,0Dh  &#59;me llego un enter?
  168.   JNE sigue
  169.   mov columna_recibe,0
  170.   cmp renglon_recibe,9
  171.   jne sigue
  172.   mov ren_limpio_rec,1
  173.   mov renglon_recibe,1
  174.   jmp sigue
  175. sigue: cmp ren_limpio_rec,1
  176.   jne continua
  177.   lea dx,renglon_limpio
  178.   mov ah,09h
  179.   int 21h
  180.   jmp continua
  181. continua:  mov dl,letra_recibida
  182.   MOV ah,06h             &#59; la funcion 06h, me sirve para mostrar 1 caracter
  183.   INT 21h
  184.   MOV letra_recibida_ok,0
  185.   INC columna_recibe
  186.   JMP escribe
  187.  
  188.  &#59;######################### ACA ESCRIBO Y ENVIO POR PUERTO ##########################
  189.  &#59;#
  190.  &#59;#
  191.   escribe:  CMP letra_recibida_ok,1&#59; si la interrupcion hizo que me cayera una letra, dejo que se escriba la letra que llego
  192.   je recibir            &#59;le doy la posibilidad de que la escriba, antes de yo seguir escribiendo
  193.   MOV ah,02h           &#59;peticion para colocar el cursor
  194.   MOV bh,00h           &#59;numero de pagina 0
  195.   MOV dh,renglon_envia &#59;uso el ultimo renglon que me quedo, para seguir escribiendo en la misma posicion&#59;)
  196.   MOV dl,columna_envia &#59;uso la ultima columna que me quedo, para seguir escribiendo en la misma posicion&#59;)
  197.   INT 10h              &#59;interrupcion del bios
  198.   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
  199.   jne repite           &#59;si no he escrito aun 10 renglones, sigue con el codigo normalmente
  200.   lea dx, renglon_limpio;si no es asi, borra el primer renglon utilizado para poder escribir libremente
  201.   mov ah,09h           &#59;muestra el '             '
  202.   int 21h              &#59;DOS
  203.   repite: MOV ah,01h   &#59;pido solo 1 caracter el cual se despliega en pantalla y se guarda en al
  204.   INT 21h              &#59;DOS
  205.   cmp al,1Bh           &#59;comparo si el caracter presionado es 'esc' si es asi, se terminará el programa, de lo contrar continua
  206.   je salir_programa     &#59; esta esta clara cierto?
  207.   MOV letra_enviada,al &#59;guardo la tecla presionada en la variable tecla_enviada
  208.   MOV letra_enviada_ok,0&#59;con esto pongo una bandera de que he escrito una letra
  209.   MOV DX,0000           &#59;puerto COM1
  210.   MOV AH,01             &#59; funcion 01h-enviando un caracter al COM
  211.   MOV AL,letra_enviada  &#59;caracter a ser enviado
  212.   INT 14
  213.  &#59;MOV dx,3F8h           &#59; llamo al puerto COM1
  214.  &#59;out dx,al             &#59; escribo el caracter presionado por el puerto
  215.   inc columna_envia     &#59; si escribi una tecla, debo moverme un espacio, para eso incremento la columna
  216.   cmp letra_enviada,0dh &#59;comparo si la tecla presionada fue enter, de ser asi, necesitare hacer un salto de linea
  217.   jne repite            &#59;sino, sigue escribiendo
  218.   mov columna_envia,0   &#59;si aprete enter, retorno el carro
  219.   inc renglon_envia     &#59;salto 1 renglon
  220.   lea dx,intro          &#59;cargo un mensaje que lo unico que tiene es 1 espacio vacio
  221.   mov ah,09h            &#59;lo muestro en pantalla
  222.   int 21h               &#59;DOS
  223.   cmp renglon_envia,23  &#59;esto es para contar si ya mi cursor esta en el renglon 23
  224.   je  mod_renglon_envia &#59;y si es asi, lo reinicio al 13
  225.   jne escribe           &#59; sino, sigo escribiendo
  226. mod_renglon_envia: mov renglon_envia,13
  227.   mov ren_limpio,1       &#59;pongo una bandera avisando que y he escrito 23 renglones
  228.   jmp escribe             &#59;sigo escribiendo
  229.  
  230.  
  231. RESTAURAVECTOR 8, VIEJOIP8, VIEJOCS8
  232.  
  233. ;Enmascaro la IRQ4 en el controlador de interrupciones, y la restauro
  234. in al,21h
  235. or al,00010000b
  236. out 21h,al
  237.  
  238. salir_programa:  mov ax,4c00h
  239.                 int 21h
  240.  
  241. ;/////////INTERRUPICON PARA RECIBIR////////////
  242. recibe:
  243.   push ax
  244.   push dx
  245.   push ds
  246.  
  247.   mov ax,data
  248.   mov ds,ax
  249.   mov dx,3f8h
  250.   in al,dx
  251.   mov letra_recibida,al
  252.   mov letra_recibida_ok,1
  253.   inc renglon_recibe
  254.   mov al,20h
  255.   out 20h,al
  256.  
  257.   pop ds
  258.   pop dx
  259.   pop ax
  260.       IRET
  261.  
  262. MiProg ENDP
  263. CODE ENDS
  264. END MiProg
  265.  
  266.  

Bicholey

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Re: Com1. Ensamblador
« Respuesta #28 en: Lunes 10 de Julio de 2006, 20:42 »
0
: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.
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]


guiweb

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Com1. Ensamblador
« Respuesta #29 en: Martes 11 de Julio de 2006, 04:59 »
0
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

Bicholey

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Re: Com1. Ensamblador
« Respuesta #30 en: Miércoles 12 de Julio de 2006, 05:58 »
0
:devil:  :devil:  :devil:


je je je je je no es nada yo hice varias de esas cosas cuando iba ala uni la diferencia es que yo siempre trabaje a 16 bits y como mi especialidad es la electronica no me he actualizado,es mas a penas estoy actualizando mis conocimientos.
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]


scarecrow

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Com1. Ensamblador
« Respuesta #31 en: Lunes 4 de Junio de 2007, 17:06 »
0
Como me quedaria si lo fuera a configurar asi
Elabore un programa en lenguaje ensamblador que configure el puerto serie (COM 1) para que reciba 20 datos de 8 bits cada uno con un bit de stop y paridad par para una velocidad de 300 baudios.

Bicholey

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Re: Com1. Ensamblador
« Respuesta #32 en: Lunes 4 de Junio de 2007, 17:14 »
0
Cita de: "scarecrow"
Como me quedaria si lo fuera a configurar asi
Elabore un programa en lenguaje ensamblador que configure el puerto serie (COM 1) para que reciba 20 datos de 8 bits cada uno con un bit de stop y paridad par para una velocidad de 300 baudios.
 :P  :D  :P  :D  :P  :lol:  :lol:  :lol:


En primera ya esta todo plenamente explicado en este post, al menos tomate el tiempo de leerlo, en segunda ya habias abierto una discucion al respecto y se te respondio y en tercera no te vamos a hacer la tarea, ya tienes todo el material para hacerlo, al menos intenta esforzar un poco el cerebro, que si no podes realizar un programa tan sencillo con toda esta informacion de verdad os recomiendo que te dediques a otra profesion, quiza abogado o contador...
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]