⚙️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