Sei sulla pagina 1di 25

I

CARRERA:
ING. EN SISTEMAS COMPUTACIONALES

ASIGNATURA:
LENGUAJES DE INTERFAZ

DOCENTE:
ING. JESS A. SANTOS TEJERO
INTEGRANTES:
MARIO A. RAMREZ ARANDA
ALBERTO J. BARBOSA TREJO
KEMISH M. SALINAS GUILLERMO

FECHA DE ENTREGA:
28/MAYO/20

PROGRAMACIN DE DISPOSITIVOS

El Buffer De Video En Modo Texto


El buffer es la ubicacin de memoria de un dispositivo digital o una computadora
que est reservada para el almacenamiento temporal de informacin. Mientras los
datos estn en el buffer, esperan para ser procesados.
Por otro lado, se llama modo de texto a cualquier modo de video de un ordenador
en el que el contenido de la pantalla se representa internamente en trminos de
caracteres textuales en lugar de pixeles individuales.
Las aplicaciones en modo texto se comunican con el usuario mediante lneas de
comandos e interfaces textuales de usuario.
Las ventajas de los modos de texto respecto a los grficos incluyen el menor
consumo de memoria y la ms rpida manipulacin de pantalla. Adems, las
aplicaciones en modo texto tienen unos requisitos de ancho de banda relativamente
bajos en uso remoto.
Segn el entorno, el buffer de pantalla puede ser directamente accesible, como
memoria convencional, para los programas locales. Los programas que muestran
salidas en una terminal remota deben enviar secuencias de control especiales para
manipular el buffer de pantalla.
En el modo texto, slo se puede trabajar con los 256 (0 a 255) caracteres ASCII
que podemos ver en el apndice A, cada carcter ocupa una columna de las 80 que
caben en cada una de las 25 filas posibles. Un pixel en modo grfico es el menor
puntito que podemos iluminar en la pantalla, en el modo 13H es de 320 puntitos por
cada una de las 200 lneas posibles. En ambos casos empezamos a contar desde
la esquina superior izquierda, avanzando hacia la derecha y cuando llegamos al
extremo derecho bajamos a la fila inmediatamente inferior en su extremo izquierdo.

ACTIVIDAD FINAL | RESUMEN

Escritura directa en el buffer de video


El bfer de vdeo se encuentra localizado en la posicin de memoria B800:0000
para tarjetas en color y en B000:0000 para tarjetas monocromo. De tal modo que
podemos escribir directamente aqu sin usar las interrupciones BIOS o DOS para
conseguir su salida a pantalla.
La ventaja que obtenemos escribiendo directamente en la memoria de vdeo es
mucha mayor rapidez, puesto que las interrupciones son muy lentas, en cuanto a
un programa crtico en tiempo, como puede ser un juego. Por contra saltarse el
mtodo estndar, como son las interrupciones, supone un riesgo de encontrarse un
hardware que no soporte nuestro mtodo de acceso a la memoria de vdeo, en este
caso los resultados pueden ser impredecibles.
Abarcando los aspectos ms importantes del modo video se tiene lo siguiente:
Preparar_Pantalla PROC
MOV AH, 06H

;Funcin de limpiar pantalla

MOV BH, 80H

;Atributos de color de fondo

MOV AL, 00H

;Cantidad de Filas a Borrar Enrollar

MOV CX, 00H

;Columna inicial en CH, Columna final en CL

MOV DX, 30A0H ;Columna inicial en DH, Columna Final en DL


INT 10H
RET
Preparar_Pantalla ENDP
Para llamar al procedimiento se utiliza la funcin CALL.
CALL Preparar_Pantalla

ACTIVIDAD FINAL | RESUMEN

Acceso A Discos En Lenguaje Ensamblador


Para leer o escribir en un disco, no se realiza byte a byte, sino ms bien en bloques
de bytes, debido a que el acceso a disco implica movimientos mecnicos adems
de que el acceso se da por sectores; en este proceso no intervienen el CPU, puesto
que solo enva los comandos a la interface que maneja la unidad de disco y sta es
la que se encarga de leer o escribir informacin de un rea especial de memoria,
llamada DMA; este proceso es conocido como acceso directo a memoria.
Parmetros absolutos de un DD
Para acceder a los parmetros del disco duro, independientemente del nmero de
las particiones, hay que obtener el contenido de la palabra doble de memoria
situada en la direccin 0000:0104 que contiene la direccin donde se guarda una
tabla de 16 bytes con los parmetros absolutos de la primera unidad de disco duro.

DESPLAZAMIENTO

TAMAO

DESCRIPCIN

00H

2 Bytes

Nmero de cilindros

02H

1 Byte

Nmero de cabezas

03H

11 Bytes

0EH

1 Byte

Sectores por pista

0FH

1 Byte

(Reservado)

(Reservados)

Tabla | Estructura de la tabla de parmetros de un DD

A continuacin se presentan 3 rutinas que permiten lectura y escritura absoluta de


sectores, as como la determinacin del espacio libre disponible en un disco en
lenguaje ensamblador.

ACTIVIDAD FINAL | RESUMEN

Rutina _AbsoluteRead. Transfiere el contenido de uno o ms sectores del


disco al buffer especificado, accesando directamente a los sectores lgicos.
En caso de error, se enciende el bit de acarreo y AX contiene el cdigo del
error.
Invocacin:
PUSH <unidad de disco>
PUSH <nmero de sectores a leer>
PUSH <primer sector a leer>
PUSH SEG <buffer>
PUSH OFFSET <buffer>
Call _absoluteread
PUBLIC _absoluteread
_absoluteread PROC NEAR
ARG Buffer:DWORD, Start:WORD, NumSect:WORD,
Drive:BYTE = Arglen
PUSH BP
;Apilar BP
MOV BP,SP
;Permitir acceso a los argumentos
PUSH BX
;salvar registros
PUSH CX
PUSH DX
PUSH DS
MOV AL, Drive ;Lectura absoluta de disco
MOV CX, NumSect
MOV DX, Start
LDS BX, Buffer
INT 25H
POP BX
POP DS
;Recuperar registros
POP DX
POP CX
POP BX
POP BP
RET Arglen
_absoluteread ENDP

ACTIVIDAD FINAL | RESUMEN

Rutina_AbsoluteWrite. Transfiere el contenido del buffer especificado a uno


o ms sectores de disco, accesando directamente a los sectores lgicos. En
caso de error, se enciende el bit de acarreo y AX contiene el cdigo del error.
Invocacin:
PUSH <unidad de disco>
PUSH <nmero de sectores a escribir>
PUSH <primer sector a escribir>
PUSH SEG <buffer>
PUSH OFFSET <buffer>
Call _absolutewrite
PUBLIC _absolutewrite
_absolutewrite PROC NEAR
ARG Buffer:DWORD, Start:WORD, NumSect:WORD,
Drive:BYTE = Arglen
PUSH BP
;Salvar BP
MOV BP,SP
;Permitir acceso a los argumentos
PUSH BX
;Salvar registros
PUSH CX
PUSH DX
PUSH DS
MOV AL, Drive ;Escritura absoluta a disco
MOV CX, NumSect
MOV DX, Start
LDS BX, Buffer
INT 26H
POP BX
POP DS
;Recuperar registros
POP DX
POP CX
POP BX
POP BP
RET Arglen
_absolutewrite ENDP

ACTIVIDAD FINAL | RESUMEN

Rutina_FreeDisckSpace. Devuelve en DX:AX el espacio libre en disco


(en Kb). En caso de error, se enciende el bit de acarreo.
Invocacin:
PUSH <unidad de disco>
CALL _FreeDiskSpace
PUBLIC _FreeDiskSpace
_FreeDiskSpace PROC NEAR
ARG Drive:BYTE = ArgLen
PUSH BP
;Salvar BP
MOV BP,SP
;Permitir acceso a los argumentos
PUSH BX
;Salvar registros
PUSH CX
MOV AH,36H
;Funcin 36H
MOV DL, Drive
INT 21H
;Del DOS
MUL CX
;DX:AX = Bytes por cluster
MOV CX,1024
;CX = 1 Kb
DIV CX
;DX:AX = Kb por cluster
MUL BX
;DX:AX = Kb libres en el disco
POP CX
;Recuperar registros
POP BX
POP BP
RET ArgLen
_FreeDiskSpace ENDP

ACTIVIDAD FINAL | RESUMEN

Programacin Del Puerto Serial


El puerto serial es una interfaz de comunicaciones de datos utilizado por
computadoras y perifricos donde la informacin es transferida bit a bit enviando un
solo bit a la vez. Algunos ejemplos de puerto serial son: el puerto COM, VGA y
puerto RS-232.
En lenguaje ensamblador, se puede acudir a la interrupcin 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 interrupcin, y se
seleccionan a travs del registro AH.
En el siguiente cuadro, 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 nmero del puerto serie; el primero de ellos, COM1 se especifica como 00H.

SERVICIO

DESCRIPCIN

00H

Inicializar puerto serie

01H

Enviar un dato

02H

Recibir un dato

03H

Obtener el estado del puerto

Servicios para el puerto serial disponibles a travs de la


interrupcin 14H.

Para configurar o inicializar el puerto serie, bastar con utilizar el servicio 00 de la


interrupcin, colocando en el registro AL los valores equivalentes a los parmetros.

ACTIVIDAD FINAL | RESUMEN

BIT
4
3

Relacin de baudios.

Paridad.

Bits de parada.

Tamao del carcter.

UTILIZACIN

PARIDAD

RELACIN DE BAUDIOS
Bits

Velocidad

Bits

Significado

000

110

00

Ninguna

001

150

01

Paridad impar

010

300

10

Ninguna

011

600

11

Paridad par

100

1200

101

2400

110

4800

BITS DE PARADA

111

9600

Bits

Significado

Uno

Dos

TAMAO DEL CARACTER


Bits

Significado

00

No se utiliza

01

No se utiliza

10

7 bits

11

8 bits

Parmetros del registro AL para configurar el puerto serial en lenguaje


ensamblador

Como se puede observar, con ste mtodo es posible obtener frecuencias de


transmisin que van desde los 110 hasta los 9600 baudios.

ACTIVIDAD FINAL | RESUMEN

Para enviar un dato por el puerto serial, bastar con colocar en el registro AH el
valor 01H correspondiente a este servicio y en el registro AL el dato a ser enviado,
invocando de nuevo la interrupcin 14H.
La lectura de un dato que ha llegado al puerto se logra con el servicio 02H, el cual
devuelve en el registro AL el dato. La lectura del estado del puerto se consigue a
travs del servicio 03H de esta misma interrupcin, y retorna en el registro AX el
estado del puerto.

Por ejemplo, podemos utilizar el lenguaje ensamblador para configurar el puerto


serial para 1200 baudios, sin bit de paridad, con 1 bit de parada y 8 bits, a travs
del siguiente programa:
MOV AH,00H

;Servicio 00H de INT 14H: Inicializar puerto

MOV AL,83H

;1200 baudios, sin paridad, 1 bit de parada, con 8 bits

MOV DX,00H

;Seleccionar puerto COM1

INT 14H
MOV AH,01H

; Enviar datos por el puerto

MOV AL, 52d

;Caracter a ser enviado (ASCII = 4)

INT 14H
MOV AH,02H

;Leer el dato por el puerto

MOV AX,03H

;Obtener el estado del puerto

INT 14H
MOV AH,4CH

;Servicio 4CH de INT 21H: Terminar

INT 21H

ACTIVIDAD FINAL | RESUMEN

Programacin Del Puerto Paralelo


Conocido tambin con el nombre de CENTRONICS INTERFACE transmite los
datos en paralelo mediante un bus de 8 lneas ms las lneas de control del
protocolo y del estado de la impresora, esto nos permite disponer de varias lneas
digitales que podremos controlar independientemente y de forma inmediata.
Las PC's generalmente poseen solo uno de estos puertos (LPT1) pero se le puede
adicionar una tarjeta con un segundo puerto paralelo (LPT2). En reglas generales la
direccin hexadecimal del puerto LPT1 es igual a 0x378 (888 en decimal) y 0x278
(632 en decimal) para el LPT2.

Acceso al puerto paralelo


Las 5 entradas son "steady-state input points" y pueden programarse va
instrucciones IN del CPU.
Las 3 direcciones del puerto (DATA, STATUS, CONTROL) inician comnmente en
la 378H (otras direcciones comunes son la 278H y 3BCH); una de las lneas de
entrada es adems una interrupcin (que puede habilitarse va programa).
Normalmente la PC tiene definidos tres puertos paralelo de impresin: LPT1, LPT2
y LPT3. Sin embargo, este ltimo se ha vuelto obsoleto.
Para el control de estas lneas utilizamos tres puertos que estn direccionados
segn la siguiente tabla:
PUERTO

DIRECCIN DIRECCIN
LPT1
LPT2

Datos

378H

278H

Estado

379H

279H

Control

37AH

27AH

Ejemplo:
A continuacin, se muestra un programa para enviar distintas secuencias al puerto
paralelo y as tener efectos con Leds.

ACTIVIDAD FINAL | RESUMEN

STACK SEGMENT PARA STACK 'STACK'


DB 256 DUP (0)
STACK ENDS
ASSUME CS:CODE, DS:DATA
DATA SEGMENT
MSJ1 DB 'Ejemplo de acceso a puerto paralelo LPT1$'
MSJ2 DB 'Oprima * para Salir$'
MSJ3 DB 'Adios$'
MENSAJE DW 0
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
MOV AX, CS
MOV DS, AX
MOV MENSAJE, OFFSET MSJ1
CALL ESCRIBIR
MOV MENSAJE, OFFSET MSJ2
CALL ESCRIBIR
;Bucle principal que captura los caracteres del teclado y enva su valor ASCII
;al bus de datos del puerto paralelo el corresponde a la direccin 378h
BUCLE:
MOV AH, 01H
MOV DL, 0FFH
INT 21H

; Lee el caracter del teclado

CMP AL,'*'
;Compara el valor de AL con el valor ASCII del asterisco
JE SALIR
;Si es igual, saltar a la etiqueta SALIR
MOV DX, 378H ;DIRECCION DEL PUERTO PARALELO
; El comando OUT tiene como funcin escribir en el puerto cuya direccin
;de 16 bits se encuentra almacenada en DX, el valor a escribir de 8 bits se
;almacena en AL
OUT DX, AL
JMP BUCLE
MAIN ENDP

ACTIVIDAD FINAL | RESUMEN

; Rutina de salida
SALIR:
;Se escribe un return o alimentacin de lnea
MOV AH, 06
MOV DL, 0DH
INT 21H
MOV AH, 06H
MOV DL, 0AH
INT 21H
MOV MENSAJE, OFFSET MSJ3
CALL ESCRIBIR
; La funcin 4CH de la interrupcin 21H devuelve el control al SO.
MOV AH, 4CH
INT 21H
;Rutina para desplegar mensajes
ESCRIBIR PROC
PUSH AX
PUSH DX
MOV AH, 09H
MOV DX, MENSAJE
INT 21H
MOV AH, 06H
MOV DL, 0DH
INT 21H
MOV AH, 06H
MOV DL, 0AH
INT 21H
POP DX
POP AX
RET
ESCRIBIR ENDP
CODE ENDS
END MAIN

ACTIVIDAD FINAL | RESUMEN

Programacin Hbrida
La programacin hbrida proporciona un mecanismo por medio del cual podemos
aprovechar las ventajas del lenguaje ensamblador y los lenguajes de alto nivel, todo
esto con el fin escribir programas ms rpidos y eficientes.
Este tipo de programacin se usa en casos en donde el cdigo en ensamblador
dificulta la estructuracin del programa.
Las directivas de programacin hibrida son aquellas que nos permiten ejecutar
los comandos de ensamblador en un lenguaje de alto nivel.
La programacin hbrida proporciona un mecanismo por medio del cual
podemos aprovechar las ventajas del lenguaje ensamblador y los lenguajes de alto
nivel, todo esto con el fin de escribir programas ms rpidos y eficientes.

En este ejemplo se mostrar la forma para crear programas hbridos utilizando el


lenguaje ensamblador y Turbo Pascal.
Turbo Pascal permite escribir procedimientos y funciones en cdigo ensamblador e
incluirlas como parte de los programas en lenguaje Pascal. Para esto, Turbo Pascal
cuenta con dos palabras reservadas: Assembler y Asm. Assembler permite indicarle
a Turbo Pascal que la rutina o procedimiento que se est escribiendo est
totalmente escrita en cdigo ensamblador.
Ejemplo 1:
Procedimiento hbrido:
PROCEDURE Limpia_Pantalla;
Assembler;
Asm
MOV AX, 06H
MOV BH, 18H
MOV CX, 0000H
MOV DX, 184FH
INT 10H
END;

ACTIVIDAD FINAL | RESUMEN

El procedimiento utiliza la funcin 06H de la INT 10H del BIOS para limpiar la
pantalla. Este procedimiento es anlogo al procedimiento ClrScr de la unidad CRT
de Turbo Pascal.
En fin, podemos mezclar el cdigo ensamblador con el cdigo de cualquier otro
lenguaje que admita este procedimiento. En pascal antes de escribir el cdigo en
ensamblador hay que poner Asm y al final de nuestro cdigo End.
Ejemplo 2. Programa con un bloque de instrucciones en ensamblador
El programa solicita que se introduzcan dos nmeros, despus calcula la suma por
medio de la instruccin ADD de ensamblador y finalmente imprime el resultado en
pantalla.
Programa hbrido:
Uses Crt;
Val
Nun1, Num2, Resp : Integer;
BEGIN
WriteLine (Introduce el primer nmero: );
ReadLine(Num1);
WriteLine (Introduce el segundo nmero: );
ReadLine(Num2);
Assembler;
Asm
MOV AL, Num1
ADD AL, Num2
MOV Resp, AL
End
WriteLine(El resultado de la suma es: , Resp);
ReadLine();
End;

ACTIVIDAD FINAL | RESUMEN

A continuacin, se mostrar un ejemplo de un programa hbrido de ensamblador


con JAVA.

Programa original en JAVA:


Operaciones.java carga una librera nativa que contiene el cdigo necesario
para realizar la suma, resta y multiplicacin de dos nmeros dados (n1 y n2), y
el resultado devuelto es impreso en la pantalla desde nuestra aplicacin Java.
Public class Operaciones
{
Public native int Sumar(int a, int b);
Public native int Restar(int a, int b);
Public native int Multiplicar(int a, int b);
Static
{
System.loadlibrary("operacionesimpl");
}
Public static void main(String[] args)
{
Int n1 = 2;
Int n2 = 3;
Operaciones op = new Operaciones();
Int Resultado = op.Sumar(n1, n2);
System.out.println("El resultado es: " + Resultado);
Resultado = op.Restar(n1, n2);
System.out.println("El resultado es: " + Resultado);
Resultado = op.Multiplicar(n1, n2);
System.out.println("El resultado es: " + resultado);
}}

ACTIVIDAD FINAL | RESUMEN

Paso 1: Usar javac para compilar el programa.


Paso 2: Usar javah -jni para generar la cabecera de C

Ahora, para poder crear nuestro programa ASM necesitaremos saber cmo
llamaremos a nuestro procedimiento dentro del programa, para esto JNI hace
algo llamado decorado de nombres en el cual concatena con signos de guin
bajo (_) con los siguientes datos:
Por default primero aparece la palabra "Java" seguido del nombre de la clase y
finalmente el nombre del mtodo y los parmetros del mismo.
Para hacer esto realizamos los siguientes pasos:

1.

Abrimos la ventana de comandos y entramos al directorio donde hemos


guardado el archivo Operaciones.java.

2.

Ejecutamos javac Operaciones.java

3.

Esto habr creado un archivo .class llamado Operaciones.class

4.

Ejecutamos enseguida javah Operaciones

5.

Esto habr generado, usando el archivo Operaciones.class, el archivo


Operaciones.h el cual contiene las cabeceras de los procedimientos que
necesitaremos implementar en ASM

ACTIVIDAD FINAL | RESUMEN

Y una vez que el programa sea compilado sin errores abra el archivo
Operaciones.h con el editor de cdigo y ver un programa en C++ como este:

Operaciones.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Operaciones */
#ifndef _Included_Operaciones
#define _Included_Operaciones
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Operaciones
* Method: Sumar
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Operaciones_sumar
(JNIEnv *, jobject, jint, jint);
/*
* Class: Operaciones
* Method: Restar
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Operaciones_restar
(JNIEnv *, jobject, jint, jint);
/*
* Class: Operaciones
* Method: Multiplicar
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_Operaciones_multiplicar
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif

ACTIVIDAD FINAL | RESUMEN

No es necesario conocer de programacin en C++, solo basta con entender que


lo que est en negrita es como deberemos llamar a nuestro procedimiento en
ASM y los parmetros que deber recibir. En este caso tendremos tres
procedimientos llamados:
Java_Operaciones_sumar
Java_Operaciones_restar y
Java_Operaciones_multiplicar
Cada uno con cuatro parmetros. Los primeros dos parmetros se generan por
default; JNIEnv es un puntero hacia las funciones que se pueden usar para
interactuar con la JVM y objetos; jobject hace referencia a nuestro propio objeto;
y las ms importantes que debemos tener en cuenta son dos parmetros jint
que nos indican que est recibiendo dos parmetros de tipo entero. Adems,
estaremos devolviendo un parmetro de tipo entero (jint).
Ahora que ya sabemos cmo se llamar o llamarn los procedimientos que
deseemos definir, procederemos a crear el programa ASM y lo llamaremos
operacionesImpl.asm.

Programa hbrido:
.386
.MODEL flat,stdcall
.CODE
Java_Operaciones_Sumar PROC JNIEnv:DWORD, jobject:DWORD,a:DWORD,
b:DWORD
MOV EAX, a

;Ponemos el valor de a en el registro EAX

MOV EBX, b

;Ponemos el valor de b en el registro EBX

ADD EAX, EBX

;Sumamos el registro EAX con el de EBX. El resultado se


;guarda en EAX

RET

;Por default se retorna el valor del registro EAX

Java_Operaciones_sumar ENDP

ACTIVIDAD FINAL | RESUMEN

Java_Operaciones_Restar PROC jnienv:DWORD, jobject:DWORD, a:DWORD,


b:DWORD
MOV EAX, a
MOV EBX, b
SUB EAX, EBX

;Restamos el contenido del registro EBX al de EAX

RET
Java_Operaciones_restar ENDP

Java_Operaciones_Multiplicar PROC JNIEnv:DWORD, jobject:DWORD,


a:DWORD, b:DWORD
MOV EAX, a
MOV EBX, b
MUL EBX

;Multiplicamos el registro EBX con el registro por default EAX

RET
Java_Operaciones_multiplicar ENDP
END

.386. Define el conjunto de instrucciones que estaremos usando, aqu 80386.


.Model flat. Indica que estaremos usando un tipo de memoria plana de 32 bits
que es el que usa el 386.
stdcall. Define el orden en que se van a pasar los parmetros (izquierda a
derecha o derecha a izquierda).
Java_Operaciones_sumar proc JNIEnv:DWORD, jobject:DWORD,
a:DWORD, b:DWORD.
Aqu podemos ver la declaracin de nuestro procedimiento donde se define que
se llamar Java_Operaciones_Sumar, tal como lo vimos antes, y tendr cuatro
parmetros. Aqu podemos nombrar a nuestros parmetros como nos plazca,
pero debemos tener en cuenta el orden en el que aparecen y el tipo de dato, en
nuestro caso los parmetros que nos importan se llaman a y b.

ACTIVIDAD FINAL | RESUMEN

RET. Al terminar de ejecutarse nuestro cdigo, se har un return que devolver


el contenido del registro por default EAX, por eso no se indica explcitamente. El
valor del registro EAX ser el que capturar el programa Java y lo mostrar en
la salida de pantalla
El resto es el cdigo ASM que realizar la tarea que deseamos.

Programacin Del Puerto USB


El puerto USB (Universal Serial Bus) se utiliza para describir un tipo de puerto en la
computadora personal en donde se conectan distintos perifricos tales como
impresoras, cmaras fotogrficas, teclados, mouses e infinidad de productos de uso
generalizado.
EL puerto USB, puede ser programado a travs del lenguaje ensamblador
utilizando MASM. Sin embargo, no puede codificarse slo as, es decir, se necesita
utilizar cdigo del puerto serial junto con una combinacin de funciones e
interrupciones para asemejar a la funcionalidad del puerto USB.
A continuacin se muestra un claro ejemplo para programar un puerto USB 1.0.

; Configuration pointer table


USB_CD_Ptr
Configs
DB
low Config1, high Config1
DB
low Config1, high Config1
; Configuration Descriptor
Config1
retlw
9
; bLength Length of this descriptor
retlw
DSC_CFG
; bDescType CONFIGURATION
Config1Len
retlw
low ((EndConfig1 - Config1)/2)
; Length of this configuration
retlw
high ((EndConfig1 - Config1)/2)
retlw
NUM_INTERFACES
retlw
0x01
; bConfigValue Configuration Value
retlw
0x02
; iConfigString Index for this configuration
retlw
0x80
; bmAttributes
retlw
0x50
; Max power consumption (2X mA)

ACTIVIDAD FINAL | RESUMEN

; Interface Descriptor
retlw
9
; bLength Length of this descriptor
retlw
DSC_INTF
; bDescType INTERFACE
retlw
0x00
; Interface number
retlw
0x00
; Alternate setting
retlw
0x01
; Number of endpoints in this interface
retlw
COMM_INTF
; Class code
retlw
ABSTRACT_CONTROL_MODEL
; Subclass code
retlw
V25TER
; Protocol code
retlw
0x00
; Interface string index
; CDC Class-Specific Descriptors
retlw
5
; bFNLength (USB_CDC_HEADER_FN_DSC)
retlw
CS_INTERFACE ; bDscType
retlw
DSC_FN_HEADER
; bDscSubType
retlw
0x10
; bcdCDC (low byte)
retlw
0x01
; (high byte)
retlw
retlw
retlw
retlw

4
CS_INTERFACE
DSC_FN_ACM
0x02

; bFNLength (USB_CDC_ACM_FN_DSC)
; bDscType
; bDscSubType
; bmCapabilities

retlw
retlw
retlw
retlw
retlw

5
; bFNLength (USB_CDC_UNION_FN_DSC)
CS_INTERFACE ; bDscType
DSC_FN_UNION ; bDscSubType
CDC_COMM_INTF_ID
; bMasterIntf
CDC_DATA_INTF_ID
; bSaveIntf0

retlw
retlw
retlw
retlw
retlw

5
; bFNLength (USB_CDC_CALL_MGT_FN_DSC)
CS_INTERFACE ; bDscType
DSC_FN_CALL_MGT
; bDscSubType
0x00
; bmCapabilities
CDC_DATA_INTF_ID
; bDataInterface

; Endpoint Descriptor
retlw
7
; bLength (USB_EP_DSC)
retlw
DSC_EP
; bDscType
retlw
_EP02_IN
; bEPAdr
retlw
3
; bmAttributes (_INT)
retlw
low (CDC_INT_EP_SIZE) ; wMaxPktSize
retlw
high (CDC_INT_EP_SIZE)
retlw
0x02
; bInterval
; Interface Descriptor
retlw
9
retlw
DSC_INTF
retlw
1
retlw
0
retlw
2
retlw
DATA_INTF
retlw
0

ACTIVIDAD FINAL | RESUMEN

; bLength Length of this descriptor


; INTERFACE descriptor type
; Interface Number
; Alternate Setting Number
; Number of endpoints in this int
; Class code
; Subclass code

retlw
retlw

NO_PROTOCOL ; Protocol code


0
; Interface string index

; Endpoint Descriptors
retlw
7
; bLength (USB_EP_DSC)
retlw
DSC_EP
; bDscType
retlw
_EP03_OUT
; bEPAdr
retlw
2
; bmAttributes (_BULK)
retlw
low (CDC_BULK_OUT_EP_SIZE) ; wMaxPktSize
retlw
high (CDC_BULK_OUT_EP_SIZE)
retlw
0x00
; bInterval
retlw
retlw
retlw
retlw
retlw
retlw
retlw
EndConfig1

7
; bLength (USB_EP_DSC)
DSC_EP
; bDscType
_EP03_IN
; bEPAdr
2
; bmAttributes (_BULK)
low (CDC_BULK_IN_EP_SIZE)
; wMaxPktSize
high (CDC_BULK_IN_EP_SIZE)
0x00
; bInterval

; String pointer table


USB_SD_Ptr
Strings
DB
low String0, high String0
DB
low String1, high String1
DB
low String2, high String2
DB
low String3, high String3
DB
low String4, high String4
String0
retlw
retlw
retlw
retlw

(String1 - String0)/2 ; Length of string


DSC_STR
; Descriptor type 3
0x09
; Language ID (0x0409 as defined by MS)
0x04

String1
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

(String2-String1)/2
DSC_STR
'M'
0x00
'i'
0x00
'c'
0x00
'r'
0x00
'o'
0x00
'c'
0x00

ACTIVIDAD FINAL | RESUMEN

retlw
retlw
retlw
retlw
retlw
retlw

'h'
0x00
'i'
0x00
'p'
0x00

String2
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

(String3-String2)/2
DSC_STR
'P'
0x00
'I'
0x00
'C'
0x00
'1'
0x00
'8'
0x00
''
0x00
'U'
0x00
'S'
0x00
'B'
0x00
''
0x00
'C'
0x00
'D'
0x00
'C'
0x00

String3
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

(String4-String3)/2
DSC_STR
'V'
0x00
'1'
0x00
'.'
0x00
'1'
0x00
'F'
0x00
'S'
0x00

ACTIVIDAD FINAL | RESUMEN

String4
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

(String5-String4)/2
DSC_STR
'C'
0x00
'f'
0x00
'g'
0x00
'1'
0x00

REFERENCIAS
Alva Hilario, G., Becerril Lpez, N., Cruz Matas, D., Gonzlez Maldonado, M. Y., Romero
Ortega, F. J., & Sanchez Cruz, G. (15 de Abril de 2008). Programacin En Ensamblador
Para Procesadores 80x86. Recuperado el 26 de Mayo de 2014, de
http://es.scribd.com/doc/120689070/Ensamblador
Hurtado, A. V. (21 de Obtubre de 2012). Abre Ojos Ensamblador. Recuperado el 26 de Mayo de
2014, de http://www.abreojosensamblador.net/Productos/AOE/html/Pags/Cap08.html
Martnez, B. B. (13 de Enero de 2011). Ensamblador. Recuperado el 26 de Mayo de 2014, de
http://bbeltran.cs.buap.mx/EnsambladorDisco.pdf
Medina, R. (09 de Marzo de 2002). Programacin Avanzado en Lenguaje Ensamblador.
Recuperado el 26 de Mayo de 2014, de
http://www.ramonmedina.name/files/universidad/ac/ac0001.PDF
Vzquez, G. (26 de Noviembre de 2010). Programcin Hbrida. Recuperado el 26 de Mayo de
2014, de http://es.scribd.com/doc/44098211/programacion-hibrida

ACTIVIDAD FINAL | RESUMEN

Potrebbero piacerti anche