在线二区人妖系列_国产亚洲欧美日韩在线一区_国产一级婬片视频免费看_精品少妇一区二区三区在线

鍍金池/ 教程/ Java/ Assembly匯編 過程
Assembly 變量聲明
Assembly匯編 STOS指令
Assembly 條件
Assembly 尋址模式和MOV指令
Assembly匯編教程
Assembly - 什么是匯編語言
Assembly 循環(huán)
Assembly 內(nèi)存段
Assembly匯編 宏
Assembly 寄存器
Assembly匯編 遞歸
Assembly匯編 CMPS指令
Assembly匯編 內(nèi)存管理
Assembly匯編 LODS指令
Assembly 基本語法
Assembly匯編 過程
Assembly匯編 文件管理
Assembly匯編 數(shù)組
Assembly匯編 SCAS指令
Assembly 算術(shù)指令
Assembly 環(huán)境設(shè)置
Assembly匯編 字符串處理
Assembly 數(shù)字
Assembly 常量
Assembly匯編 MOVS指令
Assembly 邏輯指令
Assembly 系統(tǒng)調(diào)用

Assembly匯編 過程

過程或子程序在匯編語言是很重要的,匯編語言程序往往是規(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ù)據(jù)結(jié)構(gòu):

堆棧是一個類似數(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{|}
...
...