Que es un segmento?
Ma yudan a la explicación de que es un segmento en el lenguaje ensamblador.
Un segmento, en la arquitectura X86 trabajando en modo real, es una zona de memoria seleccionable entre 65536 posibles con los registros SS, ES, DS y CS
Para armar la direccion fisica real de la memoria se le suma a estos segmentos desplazados 4 bits a la izquierda un dato llamado offset que puede venir del codigo de maquina (dentro de la instruccion) o de alguno de los registros de la CPU de esta forma
Seg: XXXX XXXX XXXX XXXX 0000
Offs:00000 YYYY YYYY YYYY YYYY
add: ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ
Como podras notar hay mas de una manera de acceder a la misma pocicion fisica jugando con los valores de los offsets (F000:3BC0 es lo mismo que F3BC:0000) lo que trae varios problemas en programacion usando punteros (concretamente comparandolos)
DOS asigna la memroia por paragraph (parrafos) que son segmentos con una separacion de 16 bytes, es decir, si el ultimo parrafo asignado fue el 005A tendremos un area reservada que va de 005A0 a 005AF y el proximo parrafo iniciara en 005B.
En el modo protegido del 286/386 los segmentos son una cosa similar pero el dato de los resitros SS, ES, DS, y CS no es una direccion de memoria sino el indice a una tabla de descriptores de segmento en donde se tiene la pocicion de inicio del segmento y otros datos como los permisos de lectura, escritura, ejecucion, etc. propios del modo protegido de los X86.
Para obtener la direccion fisica real de memoria se suma esta direccion base contenida en el descriptor de segmento y el offset que es igual al offset en modo real.
Cave destacar que existen dos tipos distintos de tablas de descritpores de segmentos, una global (y solo puede haber una) y una local al programa o proceso en ejecucion. Cambiando esta tabla es pocible tener ditintas zonas de memoria totalmente independientes entre varios programas.
Bueno, no me enrroyo mas con el modo protejido porque es muy posible que no sea eso lo que necesitas.
Suerte.
Para armar la direccion fisica real de la memoria se le suma a estos segmentos desplazados 4 bits a la izquierda un dato llamado offset que puede venir del codigo de maquina (dentro de la instruccion) o de alguno de los registros de la CPU de esta forma
Seg: XXXX XXXX XXXX XXXX 0000
Offs:00000 YYYY YYYY YYYY YYYY
add: ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ
Como podras notar hay mas de una manera de acceder a la misma pocicion fisica jugando con los valores de los offsets (F000:3BC0 es lo mismo que F3BC:0000) lo que trae varios problemas en programacion usando punteros (concretamente comparandolos)
DOS asigna la memroia por paragraph (parrafos) que son segmentos con una separacion de 16 bytes, es decir, si el ultimo parrafo asignado fue el 005A tendremos un area reservada que va de 005A0 a 005AF y el proximo parrafo iniciara en 005B.
En el modo protegido del 286/386 los segmentos son una cosa similar pero el dato de los resitros SS, ES, DS, y CS no es una direccion de memoria sino el indice a una tabla de descriptores de segmento en donde se tiene la pocicion de inicio del segmento y otros datos como los permisos de lectura, escritura, ejecucion, etc. propios del modo protegido de los X86.
Para obtener la direccion fisica real de memoria se suma esta direccion base contenida en el descriptor de segmento y el offset que es igual al offset en modo real.
Cave destacar que existen dos tipos distintos de tablas de descritpores de segmentos, una global (y solo puede haber una) y una local al programa o proceso en ejecucion. Cambiando esta tabla es pocible tener ditintas zonas de memoria totalmente independientes entre varios programas.
Bueno, no me enrroyo mas con el modo protejido porque es muy posible que no sea eso lo que necesitas.
Suerte.
