Procedure o subroutine sono molto importanti in linguaggio assembly, come i programmi in linguaggio assembly tendono ad essere di grandi dimensioni. Le procedure sono identificati da un nome. A seguito di tale nome, il corpo della procedura è descritta che svolge un lavoro ben definito. Fine della procedura è indicata da un return.

Sintassi
Ecco la sintassi per definire una procedura -

proc_name:
procedure body

ret
La procedura viene chiamata da un'altra funzione utilizzando l'istruzione CALL. L'istruzione CALL deve avere il nome della procedura chiamata come argomento, come illustrato di seguito -

CALL proc_name
La procedura chiamata restituisce il controllo alla procedura chiamante utilizzando l'istruzione RET.

Esempio
Scriviamo una semplice procedura denominata somma che si aggiunge alle variabili memorizzate nell'area ECX e EDX registro e restituisce la somma nel registro EAX -

section .text
global _start ;must be declared for using gcc

_start: ;tell linker entry point
mov ecx,'4'
sub ecx, '0'

mov edx, '5'
sub edx, '0'

call sum ;call sum procedure
mov [res], eax
mov ecx, msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel

mov ecx, res
mov edx, 1
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel

mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
sum:
mov eax, ecx
add eax, edx
add eax, '0'
ret

section .data
msg db "The sum is:", 0xA,0xD
len equ $- msg

segment .bss
res resb 1
Quando il codice di cui sopra è compilato ed eseguito, esso produce il seguente risultato -

The sum is:
9
Struttura Stacks dati
Uno stack è un array simile nella memoria in cui i dati possono essere memorizzati e rimossi da una posizione denominata 'superiore' della pila. I dati che devono essere memorizzati è 'spinto' nella pila e dei dati da recuperare è 'spuntato' fuori dalla pila. Stack è una struttura dati LIFO, vale a dire, i dati memorizzati prima vengono recuperati scorso.

Linguaggio Assembly fornisce due istruzioni per le operazioni di stack: PUSH e POP. Queste istruzioni hanno sintassi come -

PUSH operand
POP address/register
Lo spazio di memoria riservato nel segmento stack viene utilizzato per implementare stack. I registri SS e ESP (o SP) sono utilizzati per attuare lo stack. La parte superiore dello stack, che punta all'ultima voce dati inseriti nello stack è puntato da SS: registro ESP, dove la SS registrare punti per l'inizio del segmento di stack e la SP (o ESP) dà l'offset in il segmento di stack.

L'attuazione stack ha le seguenti caratteristiche -

Solo parole o doubleword potrebbero essere salvate nello stack, non è un byte.

Lo stack cresce in direzione opposta, cioè verso l'indirizzo di memoria inferiore

La parte superiore dei punti stack per l'ultimo elemento inserito nella pila; che punti al byte inferiore della ultima parola inserita.

Come abbiamo discusso sulla memorizzazione dei valori dei registri nello stack prima di utilizzarli per qualche uso; ciò può essere fatto in modo seguente -

; Save the AX and BX registers in the stack
PUSH AX
PUSH BX

; Use the registers for other purpose
MOV AX, VALUE1
MOV BX, VALUE2

MOV VALUE1, AX
MOV VALUE2, BX

; Restore the original values
POP AX
POP BX
Esempio
Il seguente programma visualizza l'intero set di caratteri ASCII. Il programma principale chiama una procedura denominata visualizzazione, che visualizza il set di caratteri ASCII.

section .text
global _start ;must be declared for using gcc

_start: ;tell linker entry point
call display
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel

display:
mov ecx, 256

next:
push ecx
mov eax, 4
mov ebx, 1
mov ecx, achar
mov edx, 1
int 80h

pop ecx
mov dx, [achar]
cmp byte [achar], 0dh
inc byte [achar]
loop next
ret

section .data
achar db '0'
Quando il codice di cui sopra è compilato ed eseguito, esso produce il seguente risultato -

0123456789:;<=>[email protected][\]^_`abcdefghijklmnopqrstuvwxyz{|}