024.使用過程量偏移表實例

;過程偏移表	ProcTable.asm
;本程序包含了過程偏移量表格
;它使用這個表格執行間接過程調用

include irvine32.inc

.data
	CaseTable	BYTE	'A'					;查詢值
	DWORD		Process_A					;過程地址
	EntrySize=($-CaseTable)					;
				BYTE	'B'					;
	DWORD		Process_B					;
				BYTE	'C'					;
	DWORD		Process_C					;
				BYTE	'D'					;
	DWORD		Process_D					;
	NumberOfEntries=($-CaseTable)/EntrySize	;
	prompt		BYTE	"Press capital A B C or D:",0

	;爲每一個過程定義一個單獨的消息字符串
	msgA		BYTE	"Process_A",0		;
	msgB		BYTE	"Process_B",0		;
	msgC		BYTE	"Process_C",0		;
	msgD		BYTE	"Process_D",0		;

.code
	main PROC
		mov edx,OFFSET prompt				;請求用戶輸入
		call WriteString					;
		call ReadChar						;將字符讀取到AL
		mov ebx,OFFSET CaseTable			;設置ebx爲表指針
		mov ecx,NumberOfEntries				;循環計數器
	L1:
		cmp     al,          [ebx]			;發現匹配項?
		jne     L2							;否?繼續
		call    NEAR         PTR [ebx+1]	;是,調用過程
		;這個call指令的調用過程期地址保存在EBX+1指向的內存位置中,像這樣的間接調用需要使用NEAR PTR運算符
		call    WriteString					;顯示消息
		call    Crlf
		jmp		L3							;退出搜索
	L2:
		add		ebx,EntrySize				;指向下一個表項
		loop	L1
	L3:
		call	WaitMsg						;
		exit								;
	main ENDP

	;下面的每一個過程向EDX加載不同的字符串偏移量
	Process_A	PROC
		mov edx,OFFSET msgA					;
		ret									;
	Process_A	ENDP						;

	Process_B	PROC
		mov edx,OFFSET msgB					;
		ret									;
	Process_B	ENDP						;

	Process_C	PROC
		mov edx,OFFSET msgC					;
		ret									;
	Process_C	ENDP						;

	Process_D	PROC
		mov edx,OFFSET msgD					;
		ret									;
	Process_D	ENDP						;

END main
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章