[SOLUCIONADO] Duda con acceso a UART mediante ensamblador.

Iniciado por SARGE553413, 2 Abril 2015, 19:49 PM

0 Miembros y 1 Visitante están viendo este tema.

SARGE553413

Hola a todos.

Tengo que acceder a los registros de la UART del puerto com1 mediante ensamblador, trabajo con C++ builder en windows 98.

Lo primero que hago es conseguir la dirección del COM1 leyendo de la zona BIOS, consigo la dirección de memoria 0x3F8, que entiendo que es la dirección base de la UART del COM1.

Con esta dirección base, usando distintos desplazamientos, accederé a los registros de la UART, ¿es correcto?

Mi problema es que al intentar hacer esto, obtengo un error:

raised Exception class EAccessViolation with message 'Access violation at address 00401300. Read of address FFFFFFFF'

Esto es lo que he intentado:


[...]
asm{
   push es;
   mov ax, 3f8h;
   mov es, ax;          //ERROR
   mov ax, es:[0h]
}
[...]


También he intentado acceder a esa posición de memoria de más formas, usando el registro bx, escribiendo directamente la dirección (literal) pero no consigo acceder, siempre el mismo error:

raised Exception class EAccessViolation with message 'Access violation at address 00401300. Read of address FFFFFFFF'


 

kondrag_X1

Hola,

sinceramente a mi me aconsejaron usar ASM para procesos críticos dondo la velocidad fuera necesaría, así que imagino que es éste tu caso. Si no fuese yo tiraría de C++ y para delante de la siguiente forma.


#define p 0 /* Puerto serial */
#undef import

void main() {

unsigned int c; /* 16 bits */
c = inport (p);
printf ("Palabra leida = %x\n",c);
}

cpu2

Hola

Me parece que estas accedeciendo mal, puedes usar mejor las instrucciones in y out. Tambien te dejo esto:

http://bochs.sourceforge.net/techspec/PORTS.LST

Es una lista de ports y explica un poco las funciones, logico que tienes la explicacion desde 03F8-3FF.

Supongo que te ayudara en algo, si necesitas mas ayuda comenta.

Un saludo.

SARGE553413

Lo que se me pide específicamente es acceder a los registros de la UART y mostrar/modificar su contenido, por eso debo hacerlo de esta manera. A menos que haya una mejor.

cpu2

Miraste lo que te pase?

Aqui tienes los registros de la UART:

http://en.wikibooks.org/wiki/Serial_Programming/8250_UART_Programming#UART_Registers

Bien, y ahora que quieres hacer? Puedes escribir/leer con in y out.

Código (asm) [Seleccionar]
in al, 0x3f8   ; lees
out 0x3f8, al  ; envias, escribes


Un saludo.

SARGE553413

Gracias por la respuesta, leí la info que me has indicado pero al ver que al principio hablaba de DMA seguí buscando por google. Pero si, efectivamente debo acceder a los registros con las instrucciones IN/OUT ya que de lo contrario estoy accediendo a zonas de memoria protegidas por el SO.

MI problema era que pensaba que IN/OUT tenía que servir solo para leer datos que te envían por el puerto serie o enviarlos tu, pero no configurarlo.

Gracias de nuevo, saludos.


cpu2

Si pero te dije que es una lista, y tenias que buscar el port especifico.

Otra cosa mas, en que modo estas ejecutando el primer code, o en cual pretendes ejecutar todo esto?

Ya que haces referencia a la memoria protegida por el S.O, te lo pregunto por eso. Supongo que sabras que no puedes ejecutar eso en ring3, no?

Cualquier duda ya sabes.

Un saludo.