No se si tienes un conocimiento de la
arquitectura 32 bits, modo protegido, etc,
En el caso de que SI, perdona la explicación
y si quieres ponte en contacto en mi email
para detallarme mejor el problema. dbarcena@teleline.esEn los entornos de 32 bits, para que los programas se protegan unos de otros y el sistema operativo de los programas, existe la proteccion de memoria.
Cuando ejecutas un programa del builder, veras que el codigo te lo coloca en una dirección 40000 por ejemplo, y los datos por encima de esta dirección, y al final la pila. (no tiene por que estar en este orden)
por lo que cualquier acceso a una dirección fuera de lo asignado te dara dicha excepción.
por ejemplo:
push ebp
mov ebp,0400h
mov eax,[ebp]
pop ebp
dara una excepción,
ya que 0400 esta en una zona de memoria fuera
de la asignada al programa,
En los programas de Win32, se definen 2 selectores, principalmente:
en CS <- el selector de codigo (con el atributo de solo lectura y ejecucion)
y en DS, SS, <- apunta al selector de datos,
con atributo de lectura/escritura.
en otros compiladores, por ejemplo el watcom
para codigo 32bit/msdos, te añade otro
selector que apunta a toda la memoria fisica del ordenador, para dar acceso a las variables de la BIOS, zona de memoria, etc,
entonces si seria valido este ejemplo:
push ebp
mov ebp,0400h
mov eax,fs:[ebp] <- Ya no es una llamada near
pop ebp
O bien te permite utilizar DPMI, que es un
API que da un soporte para este tipo de cosas, reservar memoria por debajo del 1.
mega fisico, etc...