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

猜你喜欢

转载自blog.csdn.net/dosdiosas_/article/details/106253210