Pregunta teorica 2 del practico 10

Pregunta teorica 2 del practico 10

de Hugo Sebastian Rodriguez Reyes -
Número de respuestas: 1

Hola, estaba leyendo las notas de que hace el CALL y RET y habla de su funcion dependiendo de si la llamada es NEAR o FAR, donde el primero implica que el procedimiento llamado esta dentro del segmento CS y el segundo implica que el procedimiento llamado esta en otro segmento que no es CS.

Dependiendo de como haya sido llamado el procedimiento es lo que se guarda en el stack o lo que se quita.

No me queda del todo claro como puede hacerse CALL a un procedimiento desde otro segmento, alguien me puede explicar con algun ejemplo?

Desde ya, gracias!

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: Pregunta teorica 2 del practico 10

de Gustavo Brown -

Hay 2 versiones de las instrucciones CALL y RET, una hace el llamado FAR y la otra NEAR.
Cuando uno programa en assembler no precisa llamarlas distintas a las instrucciones porque el ensamblador se encarga de determinar cual versión utilizar.

- Si estoy en un procedimiento FAR, el RET es FAR
- Sino el RET ese NEAR

- Si estoy llamando a un procedimiento definido como FAR, el CALL es FAR
- Sino, el CALL es NEAR

Un procedimiento es FAR cuando se puede llamar desde otro segmento de código. Por lo tanto al llamar a dicho procedimiento la version FAR del CALL lo que hace es guardar en el stack el valor actual de CS e IP y saltar a la dirección segmentada indicada en la instrucción (que apunta al procedimiento a llamar).
En este caso, el procedimiento al hacer RET debe volver al llamador, por lo que debe quitar del stack no solo el IP del llamador sino tambien el valor del CS del llamador

Al escribir el programa, el programador indica para cada procedimiento si es FAR o NEAR (por defecto queda NEAR).
Para indicar que el procedimiento es FAR:

miProc PROC FAR
  ....
miProc ENDP

Luego en este caso si alguien llama a miProc el ensamblador sabe que debe colocar la version del CALL que es FAR, y también sabe que dentro de miProc si aparece un RET éste debe ser FAR.

Saludos,
  Gustavo