程序或子程序在汇编语言中非常重要,因为汇编语言程序的大小往往很大.程序由名称标识.遵循此名称,描述了执行明确定义的作业的过程的主体.该过程的结束由return语句指示.
以下是定义过程的语法 :
proc_name: procedure body ... ret
使用CALL指令从另一个函数调用该过程. CALL指令应该将被调用过程的名称作为参数,如下所示 :
CALL proc_name
被调用的过程使用RET指令将控制返回给调用过程.
让我们编写了一个名为 sum 的非常简单的过程,它添加了存储在ECX和EDX寄存器中的变量,并在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
当编译并执行上面的代码时,它产生以下结果 :
The sum is: 9
堆栈是类似数组的数据结构存储器中的数据可以存储数据,也可以从称为堆栈"顶部"的位置移除数据.需要存储的数据被"推送"到堆栈中,要检索的数据从堆栈中"弹出". Stack是一个LIFO数据结构,即最后检索的数据是最后检索的.
汇编语言提供了两个堆栈操作指令:PUSH和POP.这些说明的语法类似于 :
PUSH operand POP address/register
堆栈段中保留的内存空间用于实现堆栈.寄存器SS和ESP(或SP)用于实现堆栈.堆栈的顶部指向插入堆栈的最后一个数据项,由SS:ESP寄存器指向,其中SS寄存器指向堆栈段的开头,SP(或ESP)将偏移量指向堆栈段.
堆栈实现具有以下特征 :
只有单词或双字可以保存到堆栈中,而不是一个字节.
堆栈增长反方向,即朝向较低的内存地址
堆栈顶部指向堆栈中插入的最后一项;它指向插入的最后一个字的低字节.
我们讨论过在使用之前将寄存器的值存储在堆栈中它们用于某些用途;它可以通过以下方式完成;
; 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字符集.主程序调用名为 display 的过程,该过程显示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'
当编译并执行上述代码时,它会产生以下结果 :
0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ... ...