Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 1 votos - 5 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[Arquitectura] Ejercicio de Assembler Final
Autor Mensaje
r_mocca Sin conexión
Militante
Estudiando...
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 85
Agradecimientos dados: 1
Agradecimientos: 12 en 4 posts
Registro en: Feb 2011
Mensaje: #1
[Arquitectura] Ejercicio de Assembler Final Ejercicios Arquitectura de Computadoras
Buenas tengo otro ejercicio que me genero muchas dudas, se los dejo a ver si alguien me puede ayudar.

AX 0000 BX 0000 CX 0000 DX 0000 SP FFEE BP 0000 SI 0000 DI 0000
DS 1344 CS 1344 ES 1344 IP 0100

Teniendo en cuenta el valor de estos registros, calcular la direccion fisica a la que se accederia mediante las instrucciones:

POP ECX

MOV AX, [BP]

Cual es el tamaño maximo de un segmento si el registro que se debe considerar como desplazamiento en la direccion segmentada es el registro IP y a que lugar fisico de ese segmento se esta direccionando actualmente.

Espero que puedan ayudarme dado que rindo esta tarde.
Saludos!
03-08-2011 10:53
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Anirus Sin conexión
Super Moderador
Sin estado :)
*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.163
Agradecimientos dados: 81
Agradecimientos: 232 en 78 posts
Registro en: Nov 2009
Mensaje: #2
RE: [Arquitectura] Ejercicio de Assembler Final
POP ECX
Según Quiroga, página 195, el Stack Pointer apunta al próximo lugar vacío de la pila, es decir, si uno quiere meter algo en la pila, con la instrucción PUSH, tendría que acceder a la dirección SSx16+SP. Mientras que si quiere sacar algo de la pila con POP, como la pila se ocupa de arriba para abajo, o sea, las direcciones desocupadas están en números más bajos que las ocupadas, el último lugar ocupado es SSx16+SP+1 (Un lugar más arriba que el lugar vacío), esa sería la respuesta de a qué dirección se accede al llamar la instrucción POP ECX, el problema es que no tenés Stack Segment, no sé si te olvidaste de copiarlo o no te lo dieron... Igual por lo que veo pusieron a todo en el mismo segmento, suponiendo que SS valiera lo mismo que DS, ES y CS la respuesta sería:

SSx16 + SP + 1= 1344*10+ FFEE + 1 = 13440 + FFEE = 2342E

MOV AX, [BP]

Esta instrucción lo que hace es ir a la dirección contenida en el registro que está entre corchetes y fijarse qué valor hay guardado ahí para ponerlo en AX. En general esta instruccion es así: MOV registro1, [base:desplazamiento], cuando no te aparece la base, se sobreentiende que es DS, que significa Data segment, si por ejemplo la instrucción fuera MOV AX, [ES:BP] la base sería ES. Para calcular la dirección a la que se accede se hace lo mismo de siempre, base*16+desplazamiento, en este caso sería DSx16+BP, que nos da:

1344(hexadecimal)x16(decimal) + 0000(hexadecimal) = 1344(hexadecimal)*10(hexadecimal)+ 0000(hexadecimal) = 13440


Cuál es el tamaño maximo de un segmento si el registro que se debe considerar como desplazamiento en la direccion segmentada es el registro IP ?

Si vos tenés un segmento de supongamos, 100bytes, tu desplazamiento va a ir de 0 bytes(comienzo del primer byte) a 99bytes (comienzo del último byte), es decir, el desplazamiento que podés tener coincide con el tamaño del segmento.
Acá te dicen que el desplazamiento está dado por IP, te dicen que su valor es 0100, eso es en hexadecimal, cada dígito hexadecimal son 4 binarios, por lo tanto el tamaño del registro en bits es 16. Con 16 bits podés tener \[2^1^6\] de desplazamiento, ese es el tamaño del segmento, \[2^6*2^1^0b=64kb\]

A qué lugar fisico de ese segmento se esta direccionando actualmente?

IP es el Instruction Pointer, te indica el desplazamiento sobre CS, Code segment

Para calcular la dirección hacemos como antes:

CSx16+IP = 1344*10 + 0100 = 13540
Te pongo un poco de info sobre los registros a ver si queda más claro(Cualquier contradicción con la teoría es error mío).

Registros de cálculo(así los llaman en los finales, muchas veces te dicen "considere que los registros de cálculo se encuentran en 0"):
Los nombres que se les pone se refieren a para qué se usan generalmente, pero uno los puede usar como quiere.
AX: acumulador
BX: Base
CX: Contador
DX: Datos, dirección de datos.

Registros Índices: Se usan para moverse en un vector.
SI: se autoincrementa solo.
DI: se autodecrementa solo.

Por ejemplo, lo que se hace es guardarse en BX el lugar donde empieza tu vector, por ejemplo 0000 (base del vector, no del segmento), a esto se le llama direccionamiento indexado. Si vos querés ir sumando los elementos de tu vector podés hacer:

DS 1344 SI 0000

MOV AX, 0000; Pongo en 0 AX
ADD AX, [BX+SI]; Le sumo a AX lo que está en la dirección DSx16 + BX + SI= 13440 + 0000 + 0000 = 13440
ADD AX, [BX+SI]; Le sumo a AX lo que está en la dirección DSx16 + BX + SI= 13440 + 0000 + 0001= 13441 (SI se incrementó solo)
ADD AX, [BX+SI]; Le sumo a AX lo que está en la dirección DSx16 + BX + SI= 13440 + 0000 + 0002 = 13442
ADD AX, [BX+SI]; Le sumo a AX lo que está en la dirección DSx16 + BX + SI= 13440 + 0000 + 0003 = 13443

Otro caso: Si los elementos de tu vector ocupan n bytes, tendrías que ir sumando de n bytes en vez de a uno, por lo tanto sería:
ADD AX, [BX + SI*n]


Registros Punteros:

IP: Puntero de instrucciones.
SP: Puntero de pila, apunta al próximo lugar a llenar de la pila.
BP: Puntero base de pila, se lo usa para apuntar a la base de la pila o a veces cuando se quieren usar elementos de la pila sin sacarlos con POP y PUSH, y no se le quiere cambiar el valor a SP.

Registros de Segmentos
Te indican en qué dirección empieza el segmento.

DS: segmento de datos.
SS: segmento de pila.
CS : segmento de código
ES, FS y GS: segmentos extra (para que el programador los use cuando necesita más)

Cálculo de direcciones:

Forma de expresar dirección: base:desplazamiento
Se calcula: basex16 + desplazamiento

Nota: 16 decimal es 10 en hexadecimal, así que multiplicar por 16 la base es lo mismo que agregarle un 0 si está en hexadecimal, o 0000 si está en binario.


Lugar vacío de la pila: SS:SP = SSx16 + SP
Último elemento de la pila: SS:SP+1 = SSx16+SP+1

Nota: cuando hagas algún cálculo con SP, decí que apunta al próximo lugar vacío de la pila, porque si no mal recuerdo, en Quiroga decía eso y en Angulo otra cosa


Dirección de la próxima instrucción a leer: CS:IP =CSx16+IP

Dirección de una instrucción (ejemplo):

0100 MOV AX, 0000

Su dirección es: CS:0100 = CSx16 + 0100

Dirección de un dato(ejemplo):

MOV AX,[BX]; la dirección es DSx16+BX
MOV AX,[DS:BX]; la dirección es DSx16+BX
MOV AX,[ES:BX]; la dirección es ESx16+BX

A esto se le llama direccionamiento relativo a una base.


(Este mensaje fue modificado por última vez en: 03-08-2011 14:51 por Anirus.)
03-08-2011 13:49
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Anirus recibio 6 Gracias por este post
Vallo (10-02-2014), CarooLina (23-02-2014), mattias14 (20-10-2014), maartin090 (02-03-2015), pampa833 (21-09-2015), OzuSkywalker (16-11-2020)
r_mocca Sin conexión
Militante
Estudiando...
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 85
Agradecimientos dados: 1
Agradecimientos: 12 en 4 posts
Registro en: Feb 2011
Mensaje: #3
RE: [Arquitectura] Ejercicio de Assembler Final
Gracias por los datos, te hago una preguntamas. Como se llama cada parte de una instruccion en assembler? osea, por que a veces aparecer instrucciones asi 0100 MOV AX, 0000 o a veces aparecen 0100:XXXX al principio? Que significa eso? o por que aveces aparece la instruccion sin ningun numero adelante de todo?
17-09-2011 16:30
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Anirus Sin conexión
Super Moderador
Sin estado :)
*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.163
Agradecimientos dados: 81
Agradecimientos: 232 en 78 posts
Registro en: Nov 2009
Mensaje: #4
RE: [Arquitectura] Ejercicio de Assembler Final
Es la dirección de la instrucción, te la suelen escribir no más cuando te la van a preguntar.

Por ejemplo te pueden preguntar la dirección en que está almacenada la instrucción
0100 MOV AX, 0000
Para eso tenés que saber cuanto vale CS (base del segmento de código) y hacer CSx16+0100.
A veces en vez de darte las instrucciones y CS por separado te lo dan todo junto, así:

1444:0100 MOV AX, 0000
1444:0104 MOV BX, 0001
1444:0108 ADD AX, BX


Lo que está antes de los dos puntos es el valor de la base, así que las direcciones de esas instrucciones serían:

1444x16+0100 = 14440+0100 = 14540
1444x16+0104 = 14544
1444x16 +0104 = 14548
17-09-2011 18:38
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] Anirus recibio 1 Gracias por este post
OzuSkywalker (16-11-2020)
LeandroG Sin conexión
Militante
Ingeniero en Sistemas
***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 78
Agradecimientos dados: 69
Agradecimientos: 64 en 16 posts
Registro en: Feb 2011
Mensaje: #5
RE: [Arquitectura] Ejercicio de Assembler Final
(03-08-2011 13:49)Anirus escribió:  POP ECX
Según Quiroga, página 195, el Stack Pointer apunta al próximo lugar vacío de la pila, es decir, si uno quiere meter algo en la pila, con la instrucción PUSH, tendría que acceder a la dirección SSx16+SP. Mientras que si quiere sacar algo de la pila con POP, como la pila se ocupa de arriba para abajo, o sea, las direcciones desocupadas están en números más bajos que las ocupadas, el último lugar ocupado es SSx16+SP+1 (Un lugar más arriba que el lugar vacío), esa sería la respuesta de a qué dirección se accede al llamar la instrucción POP ECX, el problema es que no tenés Stack Segment, no sé si te olvidaste de copiarlo o no te lo dieron... Igual por lo que veo pusieron a todo en el mismo segmento, suponiendo que SS valiera lo mismo que DS, ES y CS la respuesta sería:

SSx16 + SP + 1= 1344*10+ FFEE + 1 = 13440 + FFEE = 2342E

Una consulta, en el resultado de 2342E, me parece que te olvidaste de sumar el ultimo 1, que daria una solucion de 2342F.

Saludos!

PD: MUCHAS GRACIAS POR LA EXPLICACION, COMPLETISIMA !!
(Este mensaje fue modificado por última vez en: 09-02-2014 14:43 por LeandroG.)
09-02-2014 14:30
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 2 invitado(s)