Ensamblador - sobre el registro BP

 
Vista:

sobre el registro BP

Publicado por RG (2 intervenciones) el 27/06/2002 00:56:08
Hola compañeros, os comento que hace tan sólo unos meses empezé a estudiar ASM (para plataformas Intel), y por supuesto lo hago a manera autodidacta ya que no encuentro a alguien que me pueda ayudar personalmente.

Bueno, el caso es que he aprendido unas cosas básicas, pero me he topado con un trozo de código el cual entiendo sólamente en un 90%.
Hay un trozo fundamental en éste que lo haría totalmente comprensible para mi, y básicamente el trozo de código gira en torno al registro BP y el calculo de offsets a partir de éste.
Aqui no puedo adjuntar todo el código, pero al que le interese puede responderme a éste mensaje y yo le enviaría el código.
Pero.... principalmente... acudo aqui ahora para que alguien me diga en que consiste este registro, cuales son sus funciones, para qué se utiliza, etc, etc.

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

BP, todo un tema

Publicado por Jorge (126 intervenciones) el 13/07/2002 06:44:05
Como todos los mnemónicos de ASM, BP significa algo: Base Pointer. Es el registro que guarda la dirección de inicio de la pila.
Puede parecer medio pavo, ya que ¿por qué no utilizar el SS y asumir por default el inicio del segmento?.
Bueno, la respuesta está en la "localidad". Cuando estás programando es realmente muy difícil que vayas a hacer todo el programa en forma lineal. Generalmente lo dividís en procedimientos. Cada procedimiento puede acceder a las variables globales y, además, a sus propias variables, que no son accesibles por nadie más. Éstas variables se conocen como variables locales. Ahora, pensar en esto desde el alto nivel es fácil, pero cuando bajás a ASM, te das cuenta que la compilación se complica mucho si para cada variable local tenés que reservar un lugar en la pila de variables globales (incluso se despedicia mucho espacio y el acceso no aprovecha los favores de la memoria caché). Por otro lado, la pila se podría ir incrementando a medida que se llamen a los procedimientos y éstos, a su vez, declaren variables. Eso está bien, pero así, el direccionamiento sería muy complicado, imaginate que si llamás a una rutina en forma recursiva, el mismo código debería ser capaz de identificar a su variable en la pila y sería todo muy lento y los programas se haría más grandes.
Ese es el panorama sin BP. De lo dicho, lo único lógico y útil es que la pila crezca a medida que se necesita. El problema es resolver el caso recursivo. La solución que se encontró es la siguiente:

(sigue...)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

BP, todo un tema 2

Publicado por Jorge (126 intervenciones) el 13/07/2002 06:45:28
(viene del anterior...)

Dado que el registro BP apunta al inicio de la pila y el registro SP apunta al final. Cada vez que llamás a un procedimiento, se hace la siguiente secuencia:
1) se salva BP (push BP)
2) se apunta BP al final de la pila (mov BP, SP)
3) este paso es opcional, se suma a SP un entero que reserva espacio para las variables locales (add SP, n)
Así, te asegurás que la pila no se sobreescriba y los datos pueden accederse con un desplazamiento constante a partir de BP (no importa si llamaste al procedimiento un montón de veces en forma recursiva, ¿te das cuenta?)
Al salir del proceso, lo único que haces es lo siguiente:
1) apuntas SP al principio actual de la pila, restando n - 2 (si compilaste a 16 bits) ó n - 4 (si fue a 32), para que quede apuntando a BP - 2 ó a BP - 4 (acordate también que al inicio hiciste "push bp" y que eso ocupó la sima de la pila.)
2) restaurás BP haciendo: pop BP.

Ahora, antes que me chillen los demás, hago unas aclaraciones: el tema de que las variables están en la pila, es mentira, eso sólo sucede si haces un .COM, pero para ilustrar la idea me vino bárbaro. Sin embargo, hay variables que sí estan en la pila (dinámicas, pequeño tamaño y temporales).
El porqué de BP tiene más motivos, pero ya sanatee bastante esto y estoy re podrido de escribir, jaja

Espero te halla servido, chau!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:BP, todo un tema 2

Publicado por RG (2 intervenciones) el 13/07/2002 13:45:52
Gracias!. Muy buena la información.
De hecho, un día después de haber posteado aqui, encontré algunas cosas en torno al registro BP.
Pude entender el resto del código que analizaba (si te mola el tema pues es..... virii code).
Pero tu información me detalla aún más todo.
Gracias.
Cualquier cosa estamos en contacto.

Chau!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar