Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: SARGE553413 en 2 Abril 2015, 19:49 pm



Título: [SOLUCIONADO] Duda con acceso a UART mediante ensamblador.
Publicado por: SARGE553413 en 2 Abril 2015, 19:49 pm
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:
Código:
raised Exception class EAccessViolation with message 'Access violation at address 00401300. Read of address FFFFFFFF'
Esto es lo que he intentado:

Código:
[...]
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:
Código:
raised Exception class EAccessViolation with message 'Access violation at address 00401300. Read of address FFFFFFFF'

  


Título: Re: Duda con acceso a UART mediante ensamblador.
Publicado por: kondrag_X1 en 2 Abril 2015, 20:16 pm
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.

Código:
#define p 0 /* Puerto serial */
#undef import

void main() {

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


Título: Re: Duda con acceso a UART mediante ensamblador.
Publicado por: xv0 en 2 Abril 2015, 20:25 pm
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.


Título: Re: Duda con acceso a UART mediante ensamblador.
Publicado por: SARGE553413 en 2 Abril 2015, 23:36 pm
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.


Título: Re: Duda con acceso a UART mediante ensamblador.
Publicado por: xv0 en 3 Abril 2015, 01:43 am
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.

Código
  1. in al, 0x3f8   ; lees
  2. out 0x3f8, al  ; envias, escribes

Un saludo.


Título: Re: Duda con acceso a UART mediante ensamblador.
Publicado por: SARGE553413 en 3 Abril 2015, 18:55 pm
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.



Título: Re: [SOLUCIONADO] Duda con acceso a UART mediante ensamblador.
Publicado por: xv0 en 3 Abril 2015, 20:54 pm
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.