位置:首页 > > Assembly 过程

Assembly 过程

过程或子程序在汇编语言是很重要的,汇编语言程序往往是规模大。过程是由一个名称标识。按照这一名称,在过程体(body)中进行了描述,其中执行一个明确定义的工作。一个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 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

上面的代码编译和执行时,它会产生以下结果:

The sum is:
9

堆栈的数据结构:

堆栈是一个类似数组的数据结构在存储器中的数据可以被存储和删除的位置被称为“顶层”堆栈。是'推'入堆栈,要检索的数据是'弹出'从堆栈中的数据需要存储。堆栈是一个后进先出的数据结构,即先存储,数据检索。

汇编语言提供了两种的堆栈操作说明: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 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'  

上面的代码编译和执行时,它会产生以下结果:

0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}
...
...