Comunicación serial en lenguaje ensamblador.
En lenguaje ensamblador, se puede acudir a la interrupción 14H de la ROM-BIOS para configurar, leer, escribir o simplemente para conocer el estado del puerto; cada una de estas cuatro opciones es un servicio de la interrupción, y se seleccionan a través del registro AH. La figura 1 muestra los valores que debe contener el registro AH para invocar cada uno de los servicios. En todos los casos, el registro DX debe contener el número del puerto serie; el primero de ellos, COM1 se especifica como 00h.
En lenguaje ensamblador, se puede acudir a la interrupción 14H de la ROM-BIOS para configurar, leer, escribir o simplemente para conocer el estado del puerto; cada una de estas cuatro opciones es un servicio de la interrupción, y se seleccionan a través del registro AH. La figura 1 muestra los valores que debe contener el registro AH para invocar cada uno de los servicios. En todos los casos, el registro DX debe contener el número del puerto serie; el primero de ellos, COM1 se especifica como 00h.
Servicio
|
Descripción
|
00
|
Inicializar
puerto serie
|
01
|
Enviar
un dato
|
02
|
Recibir
un dato
|
03
|
Obtener
el estado del puerto
|
figura 1.Servicios
para el puerto serial disponibles a través de la interrupción 14H
Para configurar o inicializar el puerto serie,
bastará con utilizar el servicio 00 de la interrupción, colocando en el
registro AL los valores equivalentes a los parámetros, como se puede observar
en la figura 2. Con éste método es posible obtener frecuencias de transmisión
que van desde los 110 hasta los 9600 baudios.
figura 2
Para enviar un dato por el puerto serial, bastará
con colocar en el registro AH el valor 01 correspondiente a este servicio y en
el registro AL el dato a ser enviado, invocando de nuevo la interrupción 14H.
La lectura de un dato que ha llegado al puerto se logra con el servicio 02, el
cual devuelve en el registro AL el dato. La lectura del estado del puerto se
consigue a través del servicio 03 de esta misma interrupción, y retorna en el
registro AX el estado del puerto, el cual contendrá los bits que se muestran en
la figura 3.
figura 3
Por ejemplo, podemos utilizar el lenguaje
ensamblador para configurar el puerto serial para 1200 baudios, sin bit de
paridad, sin bit de parada y 8 bits, realizando el siguiente programa:
mov ah,0 ;servicio 00
de INT 14h: inicializar puerto
mov a1,83 ;configuración: 1200 baudios, no paridad,
;un bit de parada, 8 bits de datos
mov dx,00 ;Seleccionar puerto COM1
int 14 ;interrupción del BIOS
mov ah,4c ;servicio 4ch de INT 21h: terminar
int 21 ;interrupción servicio del DOS
mov a1,83 ;configuración: 1200 baudios, no paridad,
;un bit de parada, 8 bits de datos
mov dx,00 ;Seleccionar puerto COM1
int 14 ;interrupción del BIOS
mov ah,4c ;servicio 4ch de INT 21h: terminar
int 21 ;interrupción servicio del DOS
Este programa (en donde todos las cantidades están expresadas en
hexadecimal) se puede tornar ejecutable utilizando algunos de los ensambladores
para PC, o utilizando el comando DEBUG del DOS.
Otra forma de seleccionar los parámetros de la comunicación y lograr
ésta, es mediante la modificación y consulta de los registros correspondientes
al circuito integrado que maneja la comunicación serial: el UART 8250 o
similar. Como se sabe, este circuito integrado puede ser manejado como un
puerto, en el cual es posible la escritura o lectura de sus estados.
Comunicación con el puerto paralelo en lenguaje
ensamblador.
En lenguaje ensamblador, se puede leer un dato del puerto mediante la instrucción IN ó escribir un dato en el puerto con la instrución OUT , en ambos casos el registro AL debe participar activamente en la instrucción, bien sea como fuente (en operaciones de escritura) o destino (en operaciones de lectura) del dato, como en los siguientes casos:
En lenguaje ensamblador, se puede leer un dato del puerto mediante la instrucción IN ó escribir un dato en el puerto con la instrución OUT , en ambos casos el registro AL debe participar activamente en la instrucción, bien sea como fuente (en operaciones de escritura) o destino (en operaciones de lectura) del dato, como en los siguientes casos:
out DX, AL ;lleva
al puerto DX el contenido del registro AL
in AL,DX ;lleva al registro AL, el contenido del puerto DX
in AL,DX ;lleva al registro AL, el contenido del puerto DX
Otra, exigencia, es que el número del puerto sobre el que se va a
realizar la transferencia de datos debe estar señalado por le registro DX, a
excepción de los casos en los cuales el número del puerto es inferior a 255
(FFh), en cuyo caso la instrucción que lee o escribe puede señalar directamente
el puerto.
Como veran la utilización del puerto paralelo en lenguaje emsamblador es
muy sencilla.
Encender led mediante puerto paralelo.
Codigo.
STACK
SEGMENT PARA STACK 'STACK'
DB 256
DUP(0)
STACK ENDS
ASSUME CS:COD ,DS:COD
MES1 DB
‘Encender y Apagar LED con puerto paralelo’
MES2 DB
‘Oprimir S para Salir ‘
MES3 DB ‘Fin del Programa’
MENSAJE DW 0
MAIN
PROC FAR
MOV
AX.CS
MOV DS.AX
MOV MENSAJE OFFSET MES1
CALL ESCRIBIR
MOV MENSAJE OFFSET MES2
CALL ESCRIBIR
bucle
MOV AH.1
MOV DL.0FFH
INT 21H
CMP AL ‘S’
JE SALIR
MOV DX.378H
OUT DX.AL
JMP bucle
MAIN ENDP
ESCRIBIR
PROC NEAR
PUSH
AX
PUSH DX
MOV AH.09H
MOV DX.MENSAJE
INT 21H
MOV
AX.06
MOV
DL.0DH
INT 21H
MOV AH.06H
MOV DL.0AH
INT 21H
POP DX
POP AX
RET
ESCRIBIR ENDP
SALIR
MOV
AH.06
MOV DL.0DH
INT 21H
MOV AH.06H
MOV DL.0AH
INT 21H
MOV MENSAJE OFFSET MES3
CALL ESCRIBIR
MOV
AH.4CH
INT
21H
COD ENDS
END MAIN
Fuentes: http://hgr.tripod.com/puertos_ensamblador.html
https://www.youtube.com/watch?v=ImamnvO1YOE