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'
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);
}
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 (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.
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.
Miraste lo que te pase?
Aqui tienes los registros de la UART:
http://en.wikibooks.org/wiki/Serial_Programming/8250_UART_Programming#UART_Registers (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.
in al, 0x3f8 ; lees
out 0x3f8, al ; envias, escribes
Un saludo.
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.
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.