Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dudas Ensamblador x86

Iniciado por StraT, 17 de Mayo de 2007, 08:32:29 PM

« anterior - próximo »

StraT

Hola chicos, tengo unas cuantas dudas sobre ensamblador... acabo de empezar el curso y bueno, no lo llevo bien.

Tengo los siguientes registros:

DS:1000h EAX:0000FFFFh EBX:00000100h ECX:0000010Bh
ES:2000h EDX:0000AAAAh ESI: 00000002h

La siguiente tabla de memoria:

1000:0100h 00 01 02 03 04 05 06 07
1000:0108h AF 00 10 04 00 10 1A 2F
1000:0110h 12 34 56 78 90 13 31 11

Y las siguientes instrucciones:

MOVZX EBX, wordptr [ECX]
MOV ES, -2[ECX]
MOV AL, ES:100h[EBX+ESI*2]

Y me pregunta qué valor tiene EAX después de estas instrucciones. La solución es:

EAX = 0000FFAFh

Y mi pregunta es, ¿qué hacen realmente esas instrucciones en este caso y cómo llego a ese resultado? No entiendo el asunto del segmento y el desplazamiento y voy muy perdido... Si alguien pudiera ayudarme le estaría muy agradecido.

Gracias de antemano.

Saludos
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

fiero

Hola strat,

¿El curso es por tu cuenta o es de alguna escuela?
Yo creo que estas mezclando cosas, lo de segmento:desplazamiento es una forma de direccionar la memoria cuando se trabaja en 16 bits, pero tu estas usando también registros de 32 bits. ¿O acaso sí se puede programar así en algún modo extraño del procesador? Yo nunca he hecho algo así.

un saludo

[EDITO]
Bueno, veo que todas las partes altas de los registros están a 0, ¿quizás lo que querias decir era esto?

MOVZX BX, word ptr [CX]
MOV ES, -2[CX]
MOV AL, ES:100h[BX+SI*2]
www.videopanoramas.com Videopanoramas 3D player

StraT

No no, el enunciado está copiado directamente de un examen. De todas formas cuando haces el wordptr ya coges sólo 16 bits...

En fin no sé, no lo entiendo apenas.

Saludos
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

StraT

Yo me pregunto y yo me contesto xD.

MOVZX EBX, wordptr [ECX]

Coge la posicion de memoria cuya direccion es el contenido de ECX, esto es, la 0000010B, cuyo valor es 1A100004, de esto cogemos un word, esto es, 0004, y lo guardamos en EBX, reyenando el resto de los 32 bits con 0's.

EBX = 00000004;

MOV ES, -2[ECX]

Coge la direccion de memoria cuya dirección es el valor de ECX, esto es, 0000010B, le resta 2, 00000109, y la guarda, tal cual, en ES, cuyo valor ahora es 1000 (sólo guarda 16 bits pues ES es un registro de 16 bits).

MOV AL, ES:100h[EBX+ESI*2]

EBX + ESI*2 = 4+4 = 8
100h + 8 = 108
1000:108 = 041000AF

AL solo guarda el byte de menor peso, esto es, AF, con lo cual, y como resultado final, EAX = 0000FFAF.

Gracias por todo!

Saludos!
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

fiero

Joder  :D , yo he hecho un motor 3D en ensamblador y me acabas de romper todos los esquemas  :shock:

A cuadros me he quedao  :shock:  :shock:  :shock:

saludos
www.videopanoramas.com Videopanoramas 3D player

Güarmigue

jajajaja, tampoco se parece mucho al ensamblador que yo di en la facultad. Hasta esas cosas cambian.  :?
url=http://deadchannel.blogsome.com]Dead Channel[/url] - Blog de informática, juegos, tortugas y lo que me viene dando en gana ;P

Capiflash

Apuntad otro a la lista de los que se ha quedado en cuadro xDD

StraT

Pues no sé chicos xD, es lo que estoy haciendo en la asignatura de Estructura de Computadores I de la Universidad Politécnica de Catalunya (Vilanova i la Geltrú)... y bueno, la cosa es que códigos como ese compilan. A lo mejor es que yo me he explicado mal...

En fin, saludos  :oops:
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

Pogacha

No esta perfecto ... pasa que generalemente se programa en modo flat donde cs=ds=ss=es=fs=gs y así no nos preocupamos por nada.
El modo protegido permite que registro de segmento sea un redireccionamiento de memoria = un desplazamiento, que tenga un limite y que tenga propiedades de escritura y/o lectura unicamente. De ahí lo de modo protegido ... si uno escribe en un segmento de solo lectura saltará una exepción, lo mismo escribiendo fuera de rango.

Saludos

fiero

Lo que me parece raro es que el código mezcla direccionamiento de 16 bits y de 32 bits. Por ejemplo, aquí usas ECX como puntero a una dirección de 32 bits:

MOVZX EBX, word ptr [ECX]

y en otras instrucciones usas un direccionamiento seg:desplazamiento que se usaba en la programacion a 16 bits.

El 8086 era un micro que solo tenia 16 bits en el bus de direcciones, por lo que solo se podrían haber direccionado 65536 bytes de RAM. Pero se inventaron lo del segmento:desplazamiento para poder direccionar hasta 16 veces más memoria, hasta 1MB.

Con los registros de 32 bits, se pueden direccionar hasta 4GB de RAM, por eso no tiene mucho sentido usar el direccionamiento segmento:desplazamiento. MOVZX es una instrucción que se introdujo en los 80386, por lo tanto deduzco que estás usando un compilador de 32 bits y seguramente en un SO de 32 bits. No entiendo como en la universidad lian tanto las cosas. Lo mejor sería hacer algunos ejercicios de programación en 16 bits para comprender como funcionaba el 8086 y después otros ejercicios en 32 bits para aprender como van los nuevos procesadores, pero mezclar las dos cosas no lo veo muy "educativo".

un saludo
www.videopanoramas.com Videopanoramas 3D player

Pogacha

Pero que no lo usemos no quiere decir que no esten. Los segmentos son tan validos en 32 bits como en 16 bits, pero cumplen otra función: la de dar protección.

Here is how it works:
http://www.x86.org/articles/pmbasics/tspec_a1_doc.htm

MOV AL, ES:100h[EBX+ESI*2]
Es una válida instruccion de 32 bits.

Generalmente el manejo de los segmentos se los dejamos al OS, por lo que no nos preocupamos de ellos y trabajamos en modo flat, pero si tu quisieras hacerte tu manejador de memoria y modo protegido puedes basarte en un os como DOS y hacer lo que el DOS4GW y demas hacen.

Saludos






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.