Définition et appel de procédures
Apprenez à définir vos propres procédures (fonctions) à l’aide des instructions CALL et RET, et comprenez la configuration du cadre de pile.
Définition et appel de procédures est une leçon Assembly Language & x86 Low-Level Systems Programming gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Assembly Language & x86 Low-Level Systems Programming, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Assembly Language & x86 Low-Level Systems Programming comprend 4 leçons au total.
Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.
What are Procedures?
In assembly, a procedure (often called a function or subroutine) is a block of code designed to perform a specific task. They help organize your program and avoid repeating code.
Think of them like functions in high-level languages like C++ or Python. They allow you to break down complex problems into smaller, manageable parts, making your code modular and easier to read.
Calling a Procedure with CALL
To execute a procedure, we use the CALL instruction. When CALL is executed, two important things happen:
- The address of the instruction immediately after
CALLis pushed onto the stack. This is known as the return address. - The CPU then jumps to the starting address of the procedure you specified.
This mechanism ensures that the program knows exactly where to resume execution once the procedure has completed its work.
Returning from a Procedure with RET
Once a procedure has finished its assigned task, it needs to return control to the code that called it. This is achieved using the RET instruction.
When RET is executed:
- The CPU pops the return address from the top of the stack.
- The CPU then jumps to this popped address, effectively resuming execution at the instruction immediately following the original
CALL.
Together, CALL and RET form the fundamental pair for managing program flow between different procedures.
Your First Procedure Call
Let's look at a simple assembly program that demonstrates a basic procedure call and return. We'll define a procedure named print_hello and call it from our program's entry point, _start.
This example uses Linux system calls for output and program exit.
section .data
msg db "Hello from proc!", 0xA
len equ $ - msg
section .text
global _start
_start:
call print_hello
; Exit program (sys_exit)
mov eax, 1 ; System call number for sys_exit
xor ebx, ebx ; Exit code 0
int 0x80
print_hello:
; Print "Hello from proc!" (sys_write)
mov eax, 4 ; System call number for sys_write
mov ebx, 1 ; File descriptor for stdout
mov ecx, msg ; Address of string to write
mov edx, len ; Length of string
int 0x80
ret
Understanding the Output
When you run the previous code, it will print "Hello from proc!" to your console. Here's a step-by-step breakdown of what happened:
- The
_startroutine executedcall print_hello. - The address of the instruction
mov eax, 1(which is right aftercall print_hello) was pushed onto the stack. - The CPU jumped to the
print_helloprocedure. print_helloexecuted its instructions to print the message.retpopped the saved return address from the stack and jumped back to the_startroutine._startthen executed the system call to exit the program.
What are Stack Frames?
When a procedure is called, it often needs its own private workspace on the stack to manage its data. This dedicated region on the stack is called a stack frame.
A stack frame typically holds several key pieces of information for a procedure:
- The return address (pushed by the
CALLinstruction). - Saved register values (e.g., the caller's base pointer).
- Local variables specific to that procedure.
- Arguments passed to the procedure (we'll cover this in the next lesson!).
Setting Up the Base Pointer (EBP)
The base pointer register (`EBP` in 32-bit, `RBP` in 64-bit) is a crucial tool for managing stack frames. It provides a stable reference point within the current stack frame, making it easy to access local variables and arguments.
A common setup sequence at the very beginning of a procedure is:
push ebp: This saves the caller's current `EBP` value onto the stack, so it can be restored later.mov ebp, esp: This sets `EBP` to the current value of the stack pointer (`ESP`), establishing the base of the new stack frame.
Allocating Local Variables
After setting up `EBP`, a procedure can allocate space for its own local variables on the stack. This is typically done by simply decrementing the stack pointer (`ESP`).
sub esp, NHere, `N` represents the total number of bytes required for all local variables. For example, sub esp, 4 allocates enough space for one 32-bit integer.
These local variables can then be accessed efficiently relative to `EBP` (e.g., [ebp-4], [ebp-8], etc.).
Tearing Down the Stack Frame
Before a procedure returns, its stack frame must be properly dismantled to restore the stack to its original state. This involves deallocating local variables and restoring the caller's base pointer.
The LEAVE instruction is a convenient way to perform these two actions in one step:
mov esp, ebp: This deallocates any local variables by moving `ESP` back to where `EBP` points (the base of the frame).pop ebp: This restores the caller's `EBP` value, which was saved at the beginning of the procedure.
After LEAVE, the stack is correctly positioned for the RET instruction to pop the return address.
Procedure with a Stack Frame
This example demonstrates a complete procedure that sets up a proper stack frame, allocates space for a hypothetical local variable, and then correctly tears down the frame before returning.
Notice how `push ebp`, `mov ebp, esp`, `sub esp, 4`, `leave`, and `ret` work together.
section .data
msg db "Procedure with frame!", 0xA
len equ $ - msg
section .text
global _start
_start:
call my_framed_proc
; Exit program
mov eax, 1
xor ebx, ebx
int 0x80
my_framed_proc:
push ebp ; 1. Save caller's EBP
mov ebp, esp ; 2. Set EBP for new frame
sub esp, 4 ; 3. Allocate 4 bytes for a local variable
; mov dword [ebp-4], 123 ; Example: store a local value
; Print message (for demonstration)
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, len
int 0x80
leave ; 4. Deallocate locals, restore EBP
ret ; 5. Return to caller
Procedure Call Flow Check
Consider the following x86 assembly snippet:
call my_function
mov eax, 1
my_function:
ret
What specific address is pushed onto the stack by the call my_function instruction?
Defining & Calling Procedures Recap
We've covered the essential concepts of defining and calling procedures in x86 assembly. Here are the key takeaways from this lesson:
- The
CALLinstruction pushes the return address onto the stack and transfers control to a procedure. - The
RETinstruction pops the return address from the stack and transfers control back to the caller. - Stack frames, managed primarily with the
EBP/RBPregister, provide a dedicated and organized workspace on the stack for a procedure's local variables and saved registers. - A typical stack frame setup involves
push ebp,mov ebp, esp, and allocating local variables withsub esp, N. - Tearing down the stack frame is done using the
LEAVEinstruction (or manually withmov esp, ebpandpop ebp) beforeRET.
Next, we'll build on this by learning how to pass arguments to procedures and retrieve return values.
Questions Fréquemment Posées
La leçon « Définition et appel de procédures » est-elle gratuite ?
Oui — le texte complet de « Définition et appel de procédures » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Assembly Language & x86 Low-Level Systems Programming, passe à CoddyKit PRO. Le cours Assembly Language & x86 Low-Level Systems Programming comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Définition et appel de procédures » ?
Apprenez à définir vos propres procédures (fonctions) à l’aide des instructions CALL et RET, et comprenez la configuration du cadre de pile. Tu pratiques Assembly Language & x86 Low-Level Systems Programming avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Assembly Language & x86 Low-Level Systems Programming ?
Aucune expérience préalable n'est requise. Assembly Language & x86 Low-Level Systems Programming sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Définition et appel de procédures » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Assembly Language & x86 Low-Level Systems Programming ?
Oui. Chaque leçon Assembly Language & x86 Low-Level Systems Programming inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Principes fondamentaux de la pile d’appels
- Définition et appel de procédures
- Transmission des arguments et valeurs de retour
- Cadres de pile et variables locales