Direccionamiento indexado ASM

Iniciado por farresito, 19 Agosto 2010, 17:28 PM

0 Miembros y 2 Visitantes están viendo este tema.

farresito

Veréis, me estoy iniciando en ensamblador, pues creo que es fundamental. Ya conozco otros lenguajes, asi que pensé que era hora de meterme en ello.

Compré el libre de Francisco Charte Ojeda, llamado Lenguaje Ensamblador (El Pequeño) y en general, todo bien, se va entendiendo, pero tengo un pequeño problema, no llego a entender un modo de direccionamiento (estuve buscando por google y todavía lo entiendo peor; será que soy tonto). Es el llamado "Indexado" (me pasa lo mismo con el escalado que es parecido). Ahi explica que se le puede sumar desplazamiento. A que se refiere esto? Un ejemplo del que me muestra es el siguiente:
MOV AL, [BX+SI+4]

Me podriais explicar que ocurre en este ejemplo? Que es exactamente lo que se transfiere al registro AL?

También os muestro el primer ejercicio práctico que me propone hacer(esto es el resultado, es decir, la solución), por si necesitais un poco más de contexto de código (no es necesario que me lo expliqueis, no os preocupeis):

#include <stdafx.h>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
struct Incidencia {
char carretera[8];
short kilometro;
char descripcion[128];
};
Incidencia hoy[] = {
{ "A44", 32, "Nieve"},
{ "A6", 173, "Accidente"},
{ "M30", 8, "Retenciones" }
};
char *via, *problema;
short altura;
__asm {
                     ;EBX apunta al inicio del vector
lea ebx, hoy
                       ; y esi tiene tamaño por elemento
mov esi, SIZE Incidencia

                     ; se recupera puntero a la cadena carretera
lea eax, [ebx+esi*2]
mov via, eax

                       ;se recupera dato 16 bits que indica kilometro
mov ax, [ebx+esi*2+8]
mov altura, ax
                      ; se recupera puntero cadena descripcion
lea eax, [ebx+esi*2+10]
mov problema, eax
}
cout << problema << " a la altura del KM " << altura << " en la " << via << endl;
return 0;
}


Saludos! Gracias de antemano. Se que os he metido un rollazo, pero es que no puedo avanzar y alli me quedaré si alguien no me lo soluciona...  :(

Eternal Idol

Cita de: farresito en 19 Agosto 2010, 17:28 PMMe podriais explicar que ocurre en este ejemplo? Que es exactamente lo que se transfiere al registro AL?

Se mueve el byte contenido en la direccion de memoria calculada mediante la suma de BX + SI + 4.

BX es la base, SI el indice y 4 el offset al miembro de la estructura.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

farresito

Cita de: Eternal Idol en 19 Agosto 2010, 17:49 PM
Cita de: farresito en 19 Agosto 2010, 17:28 PMMe podriais explicar que ocurre en este ejemplo? Que es exactamente lo que se transfiere al registro AL?

Se mueve el byte contenido en la direccion de memoria calculada mediante la suma de BX + SI + 4.

BX es la base, SI el indice y 4 el offset al miembro de la estructura.
Mmm... Muchas gracias por responder. No se si lo entendí bien...

Supongamos que tenemos una estructura. La base sería el nombre de dicha estructura, es decir, contendría el valor de donde se encuentra (supongo que se haría con LEA). El índice sería cada uno de los elementos de dentro de la estructura y el offset, es decir el desplazamiento sería a que carácter se accede de un elemento concreto de dentro la estructura?

Gracias de antemano! Espero no seros una molestia ni un tumor.

Saludos!

Eternal Idol

#3
No tenemos una estructura sino un ARRAY (vector) de estructuras, mira el ejemplo Incidencia es la estructura y hoy el array. La base es el primer elemento del array, despues el indice apunta a un elemento del array determinado y el offset como te dije antes indica el miembro de la estructura (carretera, kilometro o descripcion segun el ejemplo).

Código (asm) [Seleccionar]
;EBX apunta al inicio del vector
lea ebx, hoy
; y esi tiene tamaño por elemento
mov esi, SIZE Incidencia
; se recupera puntero a la cadena carretera
lea eax, [ebx+esi*2]
mov via, eax


EBX = &hoy (addr hoy)
ESI=sizeof(Incidencia) (SIZE Incidencia) tamaño de la estructura
No hay offset, o dicho de otro modo el offset es 0 para acceder al primer elemento.

EBX+ESI*2=hoy[2]=hoy[2].carretera

Código (asm) [Seleccionar]
mov ax, [ebx+esi*2+8]
mov altura, ax


EBX = &hoy (addr hoy)
ESI=sizeof(Incidencia) (SIZE Incidencia) tamaño de la estructura
OFFSET = 8 [tamaño de carretera]

[ebx+esi*2+8] = hoy[2].kilometro

Código (asm) [Seleccionar]
lea eax, [ebx+esi*2+10]
mov problema, eax


EBX = &hoy (addr hoy)
ESI=sizeof(Incidencia) (SIZE Incidencia) tamaño de la estructura
OFFSET = 10 [tamaño de carretera + kilometro]
lea eax, [ebx+esi*2+10] = hoy[2].descripcion


Podes probar cambiando ESI*2 por ESI*1 y 0, asi ves como funciona el indice.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

farresito

Maravillosa la descripción! Todo muy claro! Te lo agradezco mucho!

Me quedó muy claro; ahora falta aplicarlo y ver hasta donde llego ;)

Saludos! Gracias Eternal!

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón