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{|}
...
...