elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Direccionamiento indexado ASM
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Direccionamiento indexado ASM  (Leído 6,769 veces)
farresito


Desconectado Desconectado

Mensajes: 302



Ver Perfil
Direccionamiento indexado ASM
« en: 19 Agosto 2010, 17:28 pm »

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:
Código:
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):

Código:
#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...  :(


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Direccionamiento indexado ASM
« Respuesta #1 en: 19 Agosto 2010, 17:49 pm »

Me 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.


En línea

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


Desconectado Desconectado

Mensajes: 302



Ver Perfil
Re: Direccionamiento indexado ASM
« Respuesta #2 en: 20 Agosto 2010, 00:35 am »

Me 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!
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Direccionamiento indexado ASM
« Respuesta #3 en: 20 Agosto 2010, 00:52 am »

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
  1. ;EBX apunta al inicio del vector
  2. lea ebx, hoy
  3. ; y esi tiene tamaño por elemento
  4. mov esi, SIZE Incidencia
  5. ; se recupera puntero a la cadena carretera
  6. lea eax, [ebx+esi*2]
  7. 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
  1. mov ax, [ebx+esi*2+8]
  2. 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
  1. lea eax, [ebx+esi*2+10]
  2. 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.
« Última modificación: 20 Agosto 2010, 00:55 am por Eternal Idol » En línea

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


Desconectado Desconectado

Mensajes: 302



Ver Perfil
Re: Direccionamiento indexado ASM
« Respuesta #4 en: 20 Agosto 2010, 03:57 am »

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!
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Direccionamiento indexado ASM
« Respuesta #5 en: 20 Agosto 2010, 08:43 am »

De nadas  ::)
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda Direccionamiento De categorias
Desarrollo Web
WiseHidden 6 3,777 Último mensaje 24 Junio 2011, 22:56 pm
por RedZer
Direccionamiento ip.
Redes
NetJava 2 2,745 Último mensaje 5 Julio 2011, 22:13 pm
por NetJava
Direccionamiento despues de login
PHP
hans2488 3 3,725 Último mensaje 11 Octubre 2011, 03:45 am
por ~ Yoya ~
modos de direccionamiento indexado de 5/9/16 bits
Programación C/C++
m@o_614 3 2,686 Último mensaje 8 Marzo 2014, 09:50 am
por eferion
Problema en archivo indexado
Programación C/C++
n-utz 0 1,651 Último mensaje 22 Octubre 2016, 19:15 pm
por n-utz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines