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

📄 getenv.asm

📁 汇编编程艺术
💻 ASM
字号:
;
		extrn	sl_strdup:far
		extrn	sl_free:far
		extrn	sl_strupr:far
		extrn	sl_strlen:far
;
StdGrp		group	StdLib, StdData
;
StdData		segment	para public 'sldata'
ZeroByte	db	0
StdData		ends
;
stdlib		segment	para public 'slcode'
		assume	cs:StdGrp,ds:nothing
;
;
; GetEnv-  On entry, ES:DI points at an environment variable name.
;	   This routine copies that string, converts it to upper case
;	   and then searches for that string in the environment space.
;
;	   Returns pointer to environment variable in ES:DI if it finds
;	   said variable.  Also returns carry clear in this case.
;	   Returns the carry set if it could not find the environment
;	   variable or if there was a memory allocation error.
;
		public	sl_GetEnv
sl_GetEnv	proc	far
		pushf
		push	ds
		push	si
		push	bp
		push	cx
		push	ax
		cld

; First, duplicate the string so we can play around with it:

		call	StdGrp:sl_strdup
		jc	BadGetEnv


; Now, convert all the characters in the string to upper case:

		call	StdGrp:sl_strupr

; Get the length of the string into cx:

		call	StdGrp:sl_strlen

; Save ptr to name in DS:SI for later use:

		mov	si, es
		mov	ds, si
		mov	si, di
;
; Get the address of the environment string space:
;
		mov	ah, 62h			;Get PSP value
		int	21h
		mov	es, bx
		mov	es, es:[2ch]		;Get adrs of env blk.

; Okay, search the environment string space for our string

		push	cx
		push	ds
		push	si
		mov	bp, sp
		xor	di, di			;Start at ES:[0]
		jcxz	NoMatch
CmpsLp:	repe	cmpsb				;Does this entry match?
		je	GotMatch

; The current entry did not match, try the next one:

		mov	cx, 8000h		;Save for next zero.
		mov	al, 0
	repne	scasb
		cmp	byte ptr es:[di], 0	;End of Env?
		je	GotMatch

		mov	si, 0[bp]
		mov	ds, 2[bp]
		mov	cx, 4[bp]
		jmp	CmpsLp


; If there are zero characters in the source string, just return a pointer
; to a zero byte.

NoMatch:	mov	ax, seg ZeroByte
		mov	es, ax
		mov	di, offset ZeroByte

; Return to the caller with carry clear if no error.

GotMatch:	mov	ax, es			;Save ptr to stuff after
		mov	cx, di			; the env string.

		pop	di			;Free up the string.
		pop	es
		add	sp, 2			;Pop other junk off stack.
		call	StdGrp:sl_free		

		mov	es, ax			;Restore pointer to the
		mov	di, cx			; environment string.
		clc
		pop	ax
		pop	cx
		pop	bp
		pop	si
		pop	ds
		popf
		ret

BadGetEnv:	pop	ax
		pop	cx
		pop	bp
		pop	si
		pop	ds
		popf
		stc
		ret
sl_getenv	endp

stdlib		ends
		end

⌨️ 快捷键说明

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