[2022][Compendio preguntas segundo parcial][Pregunta 9]

[2022][Compendio preguntas segundo parcial][Pregunta 9]

de Rodrigo Alejandro Aguillon Stoletniy -
Número de respuestas: 5

Buenas, tengo una duda respecto a como se trabaja el Stack Pointer y el Base Pointer dentro del stack. Primero, ¿habria que dejar la primer posicion apuntada al inicio por el BP=SP vacia y empezar a trabajar una posicion por encima de esa? Y otra duda, cuando trabajo mediante Little Endian,  ¿como se carga cada byte en memoria, es correcto poner los primeros dos digitos ´arriba´ y luego los dos ´abajo´(hexadecimal) , o van todos juntos en la misma linea?

Saludos,

Rodrigo.




En respuesta a Rodrigo Alejandro Aguillon Stoletniy

Re: Comprendido preguntas parcial

de Favio Rafael Cardoso Sanchez -
Me surgió la misma duda. Además me interesa saber como se almacena en memoria un hexadecimal por ejemplo 0x1234 cuando tenemos una numeración creciente en la memoria? y cuando es decreciente?
a esto me refiero, en este ejemplo las direcciones son decrecientes. Me surge la duda porque no se aplica lo de little-endian explícitamente, existe alguna regla mnemotécnica que permita entenderlo rápidamente?

Saludos!
En respuesta a Rodrigo Alejandro Aguillon Stoletniy

Re: [Compendio preguntas parcial][PREGUNTA9]

de Belen Brandino -
Hola,
la idea del "truco" es usar BP para tener una referencia en el stack. Para esto hacemos mov BP,SP lo cual hace que BP apunte al tope del stack y a medida que crezca el stack y SP vaya cambiando su valor, BP no lo hará y por eso tenemos una referencia fija. Antes de hacer esto, generalmente hacemos PUSH BP, para poder preservar el valor anterior del registro. Acá podes ver un diagrama (de otro ejercicio) de como queda el stack luego de hacer 
push BP
mov BP, SP

fijate que luego de hacer el mov BP queda apuntando a donde guardaste BP, no es necesario que dejes nada vacío. Lo importante es tener una referencia fija y saber donde está.

En el caso del stack (va respuesta para ambas preguntas) todas las posiciones del stack ocupan de 2 bytes siempre, por ende las podemos representar como en mi dibujo, pongo todo el valor en la posición que son 2 bytes. Internamente, se guarda utilizando Little Endian, donde en la posición más chica de memoria va el byte menos significativo (parte baja). Algo como esto (otro ejemplo):


Si algo no queda claro por favor pregunten de nuevo
saludos!
En respuesta a Belen Brandino

Re: [Compendio preguntas parcial][PREGUNTA9]

de Rodrigo Alejandro Aguillon Stoletniy -
Ahiva perfecto, lo que no me termina de quedar claro, es al inicio, en la primer linea cuando se hace PUSH DX, ¿se pushea por encima del SP, cargando las direcciones 0x3EFF y 0x3EFE, o cargaría las direcciones 0x3F00 y 0x3EFF?, si suponemos que carga como indique al principio, llego al resultado de la solución, pero no entiendo porque tendría que pasar eso,
Saludos.
En respuesta a Rodrigo Alejandro Aguillon Stoletniy

Re: [Compendio preguntas parcial][PREGUNTA9]

de Belen Brandino -
El stack crece hacia las posiciones más bajas de memoria, es decir que al apilar algo, lo hago hacia el lado de las direcciones más pequeñas. Entonces, al pushear algo el valor de SP decrece, específicamente en 2 porque cada posición del stack ocupa 2 bytes. Entonces:
al principio SP = 0x3F00
al hacer push DX, el valor de SP decrece en 2, pasando a valer 0x3EFE (0x3F00 - 0x2)

No me queda claro de donde vienen los otros valores que dijiste, pero si no se entiende pregunta de nuevo
saludos!