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{|} ... ...
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创优秀实例教程
转载请注明:文章转载自:代码驿站 [http:/www.codeinn.net]
本文标题:Assembly 过程
本文地址:http://www.codeinn.net/assembly/1017.html