Una ayudita sobre direccionamiento de datos.
Estoy empezando a aprender ensamblador y quisiera saber si las direcciones de memoria que siempre se utilizan para acceder a los datos se refieren a una memoria global (para todas las aplicaciones), o una memoria que el microprocesador reserva para cada aplicaci贸n, lo cual significar铆a que p.e. la direcci贸n 0xFFFFF en una aplicaci贸n no es la misma que la direcci贸n 0xFFFFF de otra aplicaci贸n. Si es as铆, ¿c贸mo puedo acceder a la memoria "real", la que comparten todas las aplicaci贸nes?
Que tal.
La asignaci贸n de memoria corre por cuenta del sistema operativo.
Con respecto a lo de tu ejemplo, la direcci贸n 0xFFFFF es unica y solamente se la asignara a un programa, digamos que al primero que se ejecute. En ensamblador es muy facil acceder a las direcciones de memoria de la PC, solamente debes tener cuidad de no alterar el contenido de las direcciones, esto ocacionaria que se te bloqueara el sistema.
La forma de acceder a tales posiciones de memoria es por medio del direccionamiento usando el registro DS:?.
Checalo en algun libro.
Suerte.
Te recomiendo "apuntes de lenguaje ensamblador" esta en www.monografias.com, busca la palabra ensamblador.
La asignaci贸n de memoria corre por cuenta del sistema operativo.
Con respecto a lo de tu ejemplo, la direcci贸n 0xFFFFF es unica y solamente se la asignara a un programa, digamos que al primero que se ejecute. En ensamblador es muy facil acceder a las direcciones de memoria de la PC, solamente debes tener cuidad de no alterar el contenido de las direcciones, esto ocacionaria que se te bloqueara el sistema.
La forma de acceder a tales posiciones de memoria es por medio del direccionamiento usando el registro DS:?.
Checalo en algun libro.
Suerte.
Te recomiendo "apuntes de lenguaje ensamblador" esta en www.monografias.com, busca la palabra ensamblador.
Hola.
Pero entonces ¿c贸mo le digo al sistema operativo (a Windows p.e.) que me asigne memoria?, y otra cosa: me parece haber leido que la estructura de un .EXE incluye la direcci贸n inicial de CS y de SS. ¿Esto no lo deber铆a de decidir Windows?
Pero entonces ¿c贸mo le digo al sistema operativo (a Windows p.e.) que me asigne memoria?, y otra cosa: me parece haber leido que la estructura de un .EXE incluye la direcci贸n inicial de CS y de SS. ¿Esto no lo deber铆a de decidir Windows?
Programando en entorno Windows de 32 bits, por ejemplo con MASM, tu programa siempre va a ver direcciones virtuales. El sistema operativo las convierte en direcciones lineales, y las direcciones lineales las convierte en direcciones f铆sicas. Tienes la API de Windows para reservar memoria para tu programa, pero no tienes unas API documentadas que permitan compartir directamente un bloque de memoria f铆sica entre distintos programas. Si quieres puedes compilar y enlazar un programa para que funcione en MS-DOS real, para ello necesitas descargar de alguna p谩gina de Internet el enlazador antiguo, para que tu programa funcione en modo real. Se sabe que las funciones que necesitas para acceder directamente a memoria RAM, que supongo que es lo que te gustar铆a, estan ubicadas en controles *.vxd pero no existe informaci贸n p煤blica, que yo sepa, sobre c贸mo llamarlas y qu茅 argumentos hay que pasarles. Por tanto, la memoria la administra en exclusiva el sistema operativo. Por eso se le llama sistema apropiativo ("preemptive" en ingl茅s) porque centraliza los recursos f铆sicos y no te deja acceder libremente a ellos.
Si quieres reservar memoria virtual para tu proceso utiliza la API GlobalAlloc() con la constante GMEM_FIXED como primer argumento y
el numero de bytes como segundo argumento, (en
ensamblador tienes que pasarlos en orden inverso) El valor devuelto en eax es un puntero v谩lido para el bloque de memoria virtual. Luego puedes liberar el bloque de memoria con GlobalFree() pasandole como argumento el puntero obtenido antes.
Si quieres reservar memoria virtual para tu proceso utiliza la API GlobalAlloc() con la constante GMEM_FIXED como primer argumento y
el numero de bytes como segundo argumento, (en
ensamblador tienes que pasarlos en orden inverso) El valor devuelto en eax es un puntero v谩lido para el bloque de memoria virtual. Luego puedes liberar el bloque de memoria con GlobalFree() pasandole como argumento el puntero obtenido antes.
