過程或子程序在匯編語言是很重要的,匯編語言程序往往是規(guī)模大。過程是由一個名稱標(biāo)識。按照這一名稱,在過程體(body)中進(jìn)行了描述,其中執(zhí)行一個明確定義的工作。一個return語句表示程序結(jié)束。
以下是語法來定義一個過程:
proc_name: procedure body ... ret
該過程被稱為另一個函數(shù)使用CALL指令。 CALL指令應(yīng)該有所謂的程序的名稱作為參數(shù),如下所示:
CALL proc_name
被調(diào)用過程返回給調(diào)用過程的控制,通過使用RET指令。
讓我們寫一個很簡單的程序,命名為sum 添加變量存儲在ECX和EDX寄存器EAX寄存器中返回的總和:
section .text global _start ;must be declared for using gcc _start: ;tell linker entry yiibai 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
上面的代碼編譯和執(zhí)行時,它會產(chǎn)生以下結(jié)果:
The sum is: 9
堆棧是一個類似數(shù)組的數(shù)據(jù)結(jié)構(gòu)在存儲器中的數(shù)據(jù)可以被存儲和刪除的位置被稱為“頂層”堆棧。是'推'入堆棧,要檢索的數(shù)據(jù)是'彈出'從堆棧中的數(shù)據(jù)需要存儲。堆棧是一個后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),即先存儲,數(shù)據(jù)檢索。
匯編語言提供了兩種的堆棧操作說明:PUSH和POP。這些指令的語法,如:
PUSH operand POP address/register
堆棧段中保留的存儲器空間用于執(zhí)行堆棧。用于執(zhí)行堆棧的寄存器SS和ESP(或SP)。所指向的堆棧的頂部,它指向最后一個數(shù)據(jù)項插入到堆棧的SS:ESP寄存器SS寄存器指向堆棧段的開始和SP(或ESP),其中給出的偏移量堆棧段。
實現(xiàn)的棧具有以下特點:
只有一個字符或二個字符入堆棧,而不是一個字節(jié)可以保存。
堆棧增長在相反的方向,即,朝向下底部的內(nèi)存地址
堆棧中的堆棧的頂部插入到最后一項,它指向插入的最后一個字的低字節(jié)。
正如我們討論過,它可以存儲在堆棧中的寄存器的值,在使用它們之前的一些使用方式如下:
; 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
下面的程序顯示了整個ASCII字符集。主程序調(diào)用一個程序命名為display,顯示的ASCII字符集。
section .text global _start ;must be declared for using gcc _start: ;tell linker entry yiibai 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'
上面的代碼編譯和執(zhí)行時,它會產(chǎn)生以下結(jié)果:
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|} ... ...