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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值