Direccionamiento de memoria

Direccionamiento de memoria

de Andres Gaston Gimenez Medina -
Número de respuestas: 6
Buenas. 

Creo que voy a preguntar algo que ya debería tener claro, pero boe..

Mi duda es sobre el direccionamiento de memoria, por ejemplo, en un procesador de 16 bits.

Supongamos que tengo 2 registros de uso general A y B de 16 bits.

En A tengo la dirección de memoria que deseo leer y quiero copiar su contenido a B:

MOV B,[A]

Dudas:
  • Teniendo en cuenta que los registros tienen 16 bits, lo que traigo desde memoria son 1 o 2 bytes?
  • De qué forma están organizadas las direcciones de memoria?, o sea, cuando me refiero a una "dirección de memoria", me estoy refiriendo a la dirección de 1 byte? o eso depende de la arquitectura del procesador?
  • En el caso de que estas direcciones correspondan a un solo byte, hay posibilidad de leer, en el ejemplo de una arquitectura de 16 bits, un solo byte desde memoria o al hacer MOV siempre te trae 2 bytes contiguos?
A quien pueda aclarármelo le agradezco. 

Gracias,
Saludos.
En respuesta a Andres Gaston Gimenez Medina

Re: Direccionamiento de memoria

de Matias Guzman Cubero Delgado -

Hola,

Creo que lo que estas preguntando depende de la arquitectura. Te contesto las preguntas para Intel 8086:

Teniendo en cuenta que los registros tienen 16 bits, lo que traigo desde memoria son 1 o 2 bytes?

En 8086 depende, podes traer un byte como 2 bytes.

Por ejemplo: MOV AX, [dir]

ahí estas trayendo 2 bytes dado que Ax es de dos byte.

Si pones MOV AL, [dir]

ahí estas trayendo 1 byte dado que AL es la parte baja del registro Ax siendo de 1 byte.

Lo mismo al revés,

Si haces MOV [dir], AX. Estas moviendo Ax de 2 bytes a la dirección dir. Que como cada palabra de memoria es de 1 byte, lo almacena en la dirección dir y dir + 1. En el byte de la dirección dir pone la parte baja y en el byte de la dirección dir + 1 pone la parte alta (Little Endian).

Si haces MOV [dir], AL. moves el byte contenido en Al a la dirección dir.

Ahora bien cuando no queda bien definido si queres mover un byte o una palabra a memoria por ejemplo.

MOV [dir], 0 ahí no se sabe si queres mover el byte 0 a la dirección dir, o dos byte a la dirección dir. Por esto existen BYTE PTR y WORD PTR.

Si la instrucción es MOV BYTE PTR [dir], 0, se mueve un byte.
Si la instrucción es MOV WORD PTR [dir], 0, se mueve dos byte.

De qué forma están organizadas las direcciones de memoria?, o sea, cuando me refiero a una "dirección de memoria", me estoy refiriendo a la dirección de 1 byte? o eso depende de la arquitectura del procesador?

En Intel 8086 si tenes una dirección de memoria y traes una palabra vas a traer lo que esta en esa dirección de memoria y en la consecutiva. Si traes un byte vas a traer el byte al cual apunta esa dirección. No se si estoy contestando esta pregunta? (creo que no jeje)

En el caso de que estas direcciones correspondan a un solo byte, hay posibilidad de leer, en el ejemplo de una arquitectura de 16 bits, un solo byte desde memoria o al hacer MOV siempre te trae 2 bytes contiguos?

Creo que la respuesta esta en la 1.

Espero haberte ayudado un poco,
Saludos,
Matías.



En respuesta a Matias Guzman Cubero Delgado

Re: Direccionamiento de memoria

de Usuario eliminado -
De qué forma están organizadas las direcciones de memoria?, o sea, cuando me refiero a una "dirección de memoria", me estoy refiriendo a la dirección de 1 byte? o eso depende de la arquitectura del procesador?

En Intel 8086 si tenes una dirección de memoria y traes una palabra vas a traer lo que esta en esa dirección de memoria y en la consecutiva. Si traes un byte vas a traer el byte al cual apunta esa dirección. No se si estoy contestando esta pregunta? (creo que no jeje)

Eso quiere decir que cada direccion de memoria corresponde a un solo byte? no serian dos?
Para visualizar, si se tiene
01 FB FF 90
no tendria que ser por ejemplo, en la direccion X 01 FB, y en la direccion X+1 FF 90?
Entonces, trayendo un byte de X traigo el 01, trayendo 2 se obtiene 01 FB, pero a
ún no se llega a acceder a contenido de la proxima dirección de memoria (tendria que traerse un dword, 4 bytes).
No es asi?
En respuesta a Usuario eliminado

Re: Direccionamiento de memoria

de Matias Guzman Cubero Delgado -

Hola Marcelo, como va?

Cada dirección de memoria corresponde a un byte. La pagina 2 en las notas lo induce por como almacena los datos el procesador 8086.
http://eva.fing.edu.uy/file.php/195/presentaciones/presentacion8086-1de2.pdf

Una forma de verlo es la siguiente: Mira las instrucción Push, esta hace SP = SP - 2, hace lugar, restando 2 a la dirección ósea tomando dos bytes de la memoria y después escribe en esa dirección un elemento que estrictamente tiene que ser de 2 byte.

Mismo te vas a encontrar arreglos que empiezan en la dirección SI(o cualquier otra) y para recorrerlos tenes que ir sumando de a dos, el elemento 0 esta en SI, el 1 esta en SI + 2....

Te recomiendo que te bajes emu8086, es un simulador de assembler donde podes escribir el código, correrlo, ver las flags, el stack y la memoria. Te corrige errores de sintaxis y además podes ver si anda bien lo que hiciste.

Saludos

En respuesta a Usuario eliminado

Re: Direccionamiento de memoria

de Gonzalo Tejera -
Hola. Quedó mal la última oración y no se entiende la pregunta.

Cuando te movés en la memoria en 8086 de avanzas de a bytes, entonces en X+1 accedes a FB y FF.

Saludos, Gonzalo