Ensamblador: Procedimientos
Pues ya estamos llegando a la parte final del curso para obtener los conocimientos necesarios para aprendernos a manejar en ensamblador y comenzar nuestras prácticas de cracking.
Definición El segmento de código contiene el código ejecutable de un programa. También tiene uno o mas procedimientos, definidos con la directiva PROC. Un segmento que tiene solo un procedimiento puede aparecer como sigue:
NOMBRE OPERACION OPERANDO COMENTARIO
nomsegmento SEGMENT PARA
nomproc PROC FAR ;Un
. ;procedimiento
. ;dentro
. ;del segmento
nomproc ENDP ;de código
nomsegmento ENDS
El nombre del procedimiento debe estar presente, ser único y seguir las reglas para la formación de nombres del lenguaje. El operando far en este caso esta relacionado con la ejecución del programa. Cuando usted solicita la ejecución de un programa, el cargador de programas del DOS utiliza este nombre de procedimiento como el punto de entrada para la primera instrucción a ejecutar.
La directiva ENDP indica el fin de un procedimiento y contiene el mismo nombre que el enunciado PROC para permitir que el ensamblador relacione a los dos. Ya que los procedimientos deben estar por completo dentro de un segmento, ENDP define el final de un procedimiento antes que ENDS defina el final de un segmento.
Lamada de procedimientos Hasta ahora los segmentos de código han consistido solo en un procedimiento, codificado como:
BEGIN PROC FAR
.
.
.
BEGIN ENDP
En este caso el operador FAR informa al sistema que la dirección indicada es el punto de entrada para la ejecución del programa, mientras que la directiva ENDP define el final del procedimiento. Sin embargo, un segmento de código puede tener cualquier numero de procedimientos, todos distinguidos por PROC y ENDP. Un procedimiento llamado (o subrutina) es una sección de código que realiza una tarea definida y clara (tal como ubicar el cursor o bien obtener entrada del teclado).
La organización de un programa en procedimientos proporciona los beneficios siguientes:
1. Reduce la cantidad de código, ya que un procedimiento común puede ser llamado desde cualquier lugar en el segmento de código.
2. Fortalece la mejor organización del programa.
3. Facilita la depuración del programa, ya que los errores pueden ser aislados con mayor claridad.
4. Ayuda en el mantenimiento progresivo de programas, ya que los procedimientos son identificados de forma rápida para su modificación.
Operaciones CALL y RET
La instrucción CALL transfiere el control a un procedimiento llamado, y la instrucción RET regresa del procedimiento llamado al procedimiento original que hizo la llamada. RET debe ser la ultima instrucción en un procedimiento llamado. Los formatos generales para CALL y RET son:
El código objeto particular que CALL y RET generan depende de si la operación implica un procedimiento NEAR (cercano) o un procedimiento FAR (lejano).
Llamada y regreso cercanos. Una llamada (CALL) a un procedimiento dentro del mismo segmento es cercana y realiza lo siguiente:
• Disminuye el SP en 2 (una palabra)
• Mete el IP (que contiene el desplazamiento de la instrucción que sigue al CALL) en la pila.
• Inserta la dirección del desplazamiento del procedimiento llamado en el IP (esta operación vacía el resultado de la instrucción previamente procesada),
Un RET que regresa desde un procedimiento cercano realiza lo siguiente:
• Saca el antiguo valor de IP de la pila y lo envía al IP (lo cual también vacía el resultado de la instrucción previamente procesada).
• Incrementa el SP en 2.
Ahora el CS:IP apunta a la instrucción que sigue al CALL original en la llamada del procedimiento, en donde se reasume la ejecución.
Llamada y regreso lejanos. Una llamada (CALL) lejana llama a un procedimiento etiquetado con FAR, tal vez en un segmento de código separado. Un CALL lejano mete a la pila al CS y al IP, y RET los saca de la pila.
page 60,132
TITLE P08CALLP (EXE) Llamada a procedimientos
.MODEL SMALL
.STACK 64
.DATA
;---------------------------------------------------------------------
.CODE
BEGIN PROC FAR
CALL B10 ;Llama a B10
; ...
MOV AX,4C00H ;Salida a DOS
INT 21H
BEGIN ENDP
;---------------------------------------------------------------------
B10 PROC NEAR
CALL C10 ;Llama a C10
; ...
RET ;De regreso
B10 ENDP ;Quien llama
;---------------------------------------------------------------------
END BEGIN
________________________________________
Fuente de consulta
No hay comentarios :