Los procedimientos o subrutinas son una forma básica para reutilizar código, y ademas una forma simple de abstracción que nos permite crear secuencias de acciones que tienen como fin llevar a cabo una tarea, que puede ser útil en diferentes contextos, por lo que se requiere invocar dicho grupo de instrucciones, y regresar al punto desde donde fueron invocadas, normalmente se hacen versiones generales de alguna tarea, que recibe ciertos parámetros para personalizar su comportamiento, en este ejemplo vamos a crear un procedimiento simple que permite imprimir un mensaje en pantalla usando la llamada del sistema "write" , sin tener que repetir las instrucciones para invocar la interrupción 0x80. un procedimiento se define como una etiqueta normal, pero tiene la característica de que cuenta con una instrucción "ret" al final del cuerpo del procedimiento para indicar que se regrese el control al punto desde donde se invoca, y ademas para llamar un procedimiento se debe usar la instrucción "call" y no un simple salto
.text .global _start _start: # write msg movl $len, %edx movl $msg, %ecx #invocar el procedimiento call PrintMsg call PrintMsg # write msg1 movl $len1, %edx movl $msg1, %ecx call PrintMsg # exit movl $0, %ebx movl $1, %eax int $0x80 ########################################### # procedimiento PrintMsg # # recibe en %edx el tamaño de la cadena # # recibe en %ecx el apuntador a la cadena # ########################################### PrintMsg: movl $1, %ebx movl $4, %eax int $0x80 ret #return ######################################### .data msg: .ascii "hola mundo!\n" len = 12 msg1: .ascii "mensaje 2!\n" len1 = 11
Descargar Código fuente
para ensamblar este ejemplo es necesario contar con un sistema Gnu/Linux que tenga instalado el paquete binutils para poder usar el ensamblador gnu ( as ) y el linker ( ld )
los comandos para ensamblar , enlazar y ejecutar este ejemplo son
as -o hola3.o hola3.asm
ld -o hola3 hola3.o
./hola3
la salida debe ser
hola mundo!
hola mundo!
mensaje 2!
Probando :)
ResponderBorrarse pueden tener mas de un "ret" en un mismo procedimiento??
ResponderBorrarsi, se pueden tener varios "ret" , con saltos se puede llegar a diferentes casos, y al encontrar un ret el procedimiento regresara a donde fue invocado "call"
ResponderBorrar