78
CC-BY-SA • PID_00178132
Programación en ensamblador (x86-64)
Variables locales En los lenguajes de alto nivel es habitual definir variables locales dentro de las funciones definidas en un programa. Las variables locales ocupan un espacio definido dentro de la pila. Ahora veremos cómo reservar espacio para variables locales en subrutinas definidas en ensamblador.
Para reservar el espacio necesario, hemos de saber cuántos bytes utilizaremos como variables locales. A continuación, es necesario decrementar el valor del apuntador a pila RSP tantas unidades como bytes se quieran reservar para las variables locales; de esta manera, si utilizamos las instrucciones que trabajan con la pila dentro de la subrutina (push y pop) no sobreescribiremos el espacio de las variables locales. La actualización de RSP se hace justo después de actualizar el registro que utilizamos para acceder a la pila, RBP.
subrutina: push rbp mov rbp, rsp sub rsp, n
mov rsp, rbp
RBP
pop rbp
ret
; ; ; ; ; ; ; ; ;
Almacenar el registro que utilizaremos de apuntador a la pila rbp Asignar a RBP el valor del registro apuntador RSP n indica el número de bytes reservados para las variables locales Instrucciones de la subrutina Restauramos el valor inicial de RSP con
; Restauramos el valor inicial de RBP
Como las variables locales están en la pila, se utiliza también el registro apuntador RBP para acceder a las variables. Se utiliza un direccionamiento indexado sobre el registro RBP para acceder al espacio reservado, restando un valor al registro RSP. Ejemplo push rbp mov rbp, rsp sub rsp, 8
;Almacenar el registro que utilizaremos ;de apuntador a la pila rbp ;Asignar a RBP el valor del registro apuntador RSP ;reservamos 8 bytes para variables locales
mov mov mov mov
;accedemos ;accedemos ;accedemos ;accedemos
al, byte[RBP-1] ax, word[RBP-2] eax, dword[RBP-4] rax, qword[RBP-8]
a a a a
1 2 4 8
byte de almacenamiento local bytes de almacenamiento local bytes de almacenamiento local bytes de almacenamiento local
5.4.4. Llamadas a subrutinas y paso de parámetros desde C En este subapartado se explica cómo llamar a subrutinas escritas en lenguaje de ensamblador desde un programa escrito en C y cómo transferirle parámetros.