⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 patgrab.asm

📁 汇编编程艺术
💻 ASM
字号:
		include	pattern.a

StdGrp		group	stdlib,stddata
stddata		segment	para public 'sldata'
ZeroByte	db	0
stddata		ends
;
stdlib		segment	para public 'slcode'
		assume	cs:stdgrp

		extrn	sl_malloc:far

		ifndef	@version
@version	equ	500
		endif

; sl_grab-	ES:DI points at a pattern structure on entry.  This guy
;		allocates storage for the string matched by that pattern
;		copies that string onto the heap.  This routine returns
;		a pointer to this new string on the heap in ES:DI.  Returns
;		with the carry flag set if there was a memory allocation
;		error, returns with the carry flag clear if no error occurs.

		if	@version ge 600

		public	sl_grab
sl_grab		proc	far
		pushf
		push	cx
		push	ds
		push	si
		cld

		mov	si, es
		mov	ds, si
		mov	si, di
		mov	cx, [si].Pattern.EndPattern
		sub	cx, [si].Pattern.StartPattern
		jz	NoString
		inc	cx			;Make room for zero byte.
		push	cx
		call	sl_malloc
		jc	BadGrab

		pop	cx
		push	es
		push	di
		lds	si, dword ptr [si].Pattern.StartPattern
	rep	movsb
		mov	byte ptr es:[di-1], 0	;Output zero byte.

		pop	di
		pop	es
		pop	si
		pop	ds
		pop	cx
		popf
		clc
		ret

NoString:       mov	di, seg ZeroByte
		mov	es, di
		mov	di, offset ZeroByte	;Return ptr to empty string.
		pop	si
		pop	ds
		pop	cx
		popf
		clc
		ret

BadGrab:	pop	cx
		pop	si
		pop	ds
		pop	cx
		popf
		stc
		ret
sl_grab		endp

		else			;If MASM 5.1 or TASM

		public	sl_grab
sl_grab		proc	far
		pushf
		push	cx
		push	ds
		push	si
		cld

		mov	si, es
		mov	ds, si
		mov	si, di
		mov	cx, [si].EndPattern
		sub	cx, [si].StartPattern
		jz	NoString
		inc	cx			;Make room for zero byte.
		push	cx
		call	sl_malloc
		jc	BadGrab

		pop	cx
		push	es
		push	di
		lds	si, dword ptr [si].StartPattern
	rep	movsb
		mov	byte ptr es:[di-1], 0	;Output zero byte.

		pop	di
		pop	es
		pop	si
		pop	ds
		pop	cx
		popf
		clc
		ret

NoString:       mov	di, seg ZeroByte
		mov	es, di
		mov	di, offset ZeroByte	;Return ptr to empty string.
		pop	si
		pop	ds
		pop	cx
		popf
		clc
		ret

BadGrab:	pop	cx
		pop	si
		pop	ds
		pop	cx
		popf
		stc
		ret
sl_grab		endp


		endif

stdlib		ends
		end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -