Ejercicio sobre subrutinas

Anuncio
Identificar accesos al código y a la pila
Suponed los siguientes contenidos de los registros:
SS = 0400h
ESP = 00000100h
CS = 0010h
EIP = 00000010h
Y el código siguiente:
Programa Principal
Subrutina rut1
1
Rut1 PROC
PUSH
EAX
4
PUSH ESI
2 CALL
rut1
5
MOV
ESI,0
3 POP
6
CALL rut2
ESI
7
MOV
ESI,EAX
8
POP
EAX
9
RET
Rut1 ENDP
EAX = 459A00FFh
ESI = 000FFFF0h
Subrutina rut2
Rut2 PROC
10
MOV
EAX,4
11
RET
Rut2 ENDP
Suponed que:
• La siguiente instrucción a ejecutar es la instrucción 1, que está en la dirección lógica
0010h:00000010h (tal y como indican los registros CS y EIP)
• El código de cada instrucción ocupa 1 byte de memoria
• La subrutina rut1 comienza en la dirección lógica 0010h:000000A0h
• La subrutina rut2 comienza en la dirección lógica 0010h:000000FFh
Rellenar la siguiente tabla con los datos de todos los accesos que realiza el código anterior a los
segmentos de código y pila. En concreto, cada vez que el procesador realiza un acceso a memoria hay
que rellenar una línea de la tabla indicando (ver los ejemplos en la misma tabla):
• El número de la instrucción que genera el acceso
• La dirección lógica que genera
• Si el acceso es de lectura o escritura
• El tamaño, en bytes, del dato que se lee o escribe
• El valor, en hexadecimal, del dato leído o escrito
• Una breve descripción del acceso
Se recomienda que vayáis dibujando el estado de la pila después de ejecutar cada instrucción.
No.
Dirección lógica
Inst
.
1 0010:00000010
1 0400:000000FC
2 0010:00000011
L/
E
Tam
Dato
Descripción
L
E
L
1
4
1
Código instrucción 1
459A00FF
Código instrucción 2
Fetch de la instrucción 1
Poner en la pila el valor del EAX
Fetch de la instrucción 2
11
0400:000000F0
L
4
0010:00A3
Recupera la dirección de retorno
3
0400:000000FC
L
4
459A00FF
Recupera el valor para ESI
Indicar el valor final de los registros:
SS =
CS =
ESP =
EIP =
EAX =
ESI =
Descargar