⚙️PROCEDIMIENTOS

Los procedimientos o subrutinas son muy importantes , ya que los programas tienden a ser grandes. Los procedimientos se identifican con un nombre. A continuacion de este nombre, se escribe el cuerpo del procedimiento que realiza un trabajo bien definido:

proc_name:
    procedure body
    ---
    ret

El procedimiento se llama desde otra funcion utilizando la instruccion CALL. La instruccion CALL debe tener el nombre del procedimiento llamado como argumento:

call proc_name

El procedimiento llamado devuelve el control al procedimiento de llamada mediante la instruccion RET.

EJEMPLO:

Escribamos un procedimiento muy simple llamado sum que suma las variables almacenadas en el registro ECX y EDX y devuelve la suma en el registro EAX:

section .data
    msg db 'La suma es', 0xa, 0xd
    len equ $ - msg

section .bss
    res resb 1
    
section .text
    global _start

_start:
    mov ecx, '4'
    sub ecx, '0'
    
    mov ebx, '5'
    sub ebx, '0'
    
    call sum
    mov [res], eax
    mov ecx, msg
    mov edx, len
    mov ebx, 1
    mov eax, 4
    int 0x80
    
    mov ecx, res
    mov edx, 1
    mov ebx, 1
    mov eax, 4
    int 0x80
    
    mov eax, 1
    int 0x80
    
sum:
    mov eax, ecx
    add eax, edx
    add eax, '0'
    ret
    
    

Estructura de Datos de Pilas

Una pila es una estructura de datos similar a una matriz en la mamoria en la que los datos se pueden almacenar y eliminar de una ubicacion llamada 'Parte Superor' de la pila. Los datos que deben almacenarse se 'empujan' en la pila y los datos que se deben recuperar se 'sacan' de la pila. Stack es una estructura de datos LIFO, es decir, los datos almacenados primero se recuperan en ultimo lugar.

El lenguaje asm proporciona dos instrucciones para las operaciones de pila: PUSH y POP . Estas instrucciones tienen sintaxis:

PUSH operand
POP  address/register

El espacio de memoria reservado en el segmento de la pila se utiliza para implementar la pila. Los registros SS y ESP (o SP) se utilizan para implementar la pila. La parte superior de la pila, que apunta al ultima elemento de datos insertado en la pila, es apuntada por el registro SS:ESP, donde el registro SS apunta al comienzo del segmento de pil y el SP (o ESP) da el desplazamiento en el segmento de la pila.

La implementacion de la pila tiene las siguientes caracteristicas:

  • Solo se puede guardar strings o dobles en la pila, no un byte.

  • La pila crece en la direccion inversa es decir, hacia la direccion de memoria inferior,

  • La parte superior de la pila apunta al ultimo elemento elemento insertado en la pila, apunta al byte inferior de la ultima palabra insertada.

Como discutimos sobre almacenar los valores de los registros en la pila antes de usarlos para algun uso; se puede hacer de la siguiente manera:

; Se guardan los registros en la pila
push ax
push bx


; Hacer uso de los registros
mov ax, value1
mov bx, value2
---
mov value1, ax
mov value2, bx


; Restaura los valores originales
pop bx
pop ax

EJEMPLO:

El siguiente programa muestra todo el juego de caracteres ASCII. El programa principal llama a un procedimiento denominado display, que muestra el juego de caracteres ASCII.

section .data
    achar db '0'

section .text
    global _start

_start:
    call display        ; Llamada a la funcion
    mov eax, 1          ; LLamada al sistema
    int 0x80
    
display:
    mov ecx, 256        ; Carga 256 en ecx. Este valor se utiliza como contador
    
next:
    push ecx            ; Guarda el valor actual de ecx, en la pila
    mov eax, 4          
    mov ebx, 1
    mov ecx, achar      ; Carga la direccion de memoria 
    mov edx, 1
    int 0x80
    
    pop ecx             ; Recuperamos el valor de la pila
    mov dx, [achar]     ; Cargamos el valor de acha a dx 
    cmp byte [achar], 0dh ; Compara el valor 0 con el de la valiable
    inc byte [achar]    ; Incrementa el valor de byte en 1 a achar
    loop netx           ; decrementa el valor de ecx en 1 hasta ser 0 en bucle
    ret                 ; Retorna a la funcion display

Última actualización