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

📄 exaid.asm

📁 Dos6.0
💻 ASM
📖 第 1 页 / 共 3 页
字号:
ALdR4S:
	lea	bx,[pVarBx].ASTAT_ad	; ds:bx = array descriptor address
ALdR4:
	call	ResolveArray		;resolve to segment and offset in dx:bx
	GETSEG	ds,dx,di,<SPEED,LOAD>	; Move to array element segment
	fld	dword ptr [bx]
	    mov     ax,ss
	    mov     ds,ax		;Restore the data segment
	DispMac

;End of [15]

subttl	I4 Store Executors
page
;Common
MakeExe exAIdECStI4,opAIdSt,ET_I4
	SkipExHeader
MakeExe exAIdICSt4,opAIdSt,ET_Imp
	LODSWTX 			;Load argument count
	xchg	ax,cx
	LODSWTX				;Get oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	dx,[pVarBx].ACOM_oValue		;Offset into common block
	test	byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC 
						;Is the array $STATIC?
	mov	bx,[pVarBx].ACOM_oCommon	;oCommon
	jz	@F
	add	bx,COM_bdType - COM_bdValue	;Adjust to point to type table
@@:
	add	bx,[grs.GRS_bdtComBlk.BD_pb]	;pCommon
	mov	bx,[bx].COM_bdValue.BD_pb	;Common block
	add	bx,dx				;Offset in block
	jmp	short ASt4

;Indirect
MakeExe exAIdEIStI4,opAIdSt,ET_I4
	SkipExHeader
MakeExe exAIdIISt4,opAIdSt,ET_Imp
	LODSWTX 			;Index argument count
	xchg	ax,cx
	LODSWTX 			;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	GetpFrame
	mov	bx,[pFrame]		;bx = pointer to array descriptor
	cmp	cl,[bx].AD_cDims	;Correct number of indices?
	jz	ASt4
	jmp	IndexCountErr

;Frame
MakeExe exAIdEFStI4,opAIdSt,ET_I4
	SkipExHeader
MakeExe exAIdIFSt4,opAIdSt,ET_Imp
	LODSWTX 			    ;Index argument count
	xchg	ax,cx
	LODSWTX 			    ;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	bx,[pVarBx+AFRAME_oFrame]   
	add	bx,bp			    ;bx = pointer to array descriptor
	jmp	short ASt4

	;Public


;Static
MakeExe exAIdESStI4,opAIdSt,ET_I4
	SkipExHeader
MakeExe exAIdISSt4,opAIdSt,ET_Imp
	LODSWTX 			;Load argument count
	xchg	ax,cx
	LODSWTX 			;Operand
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
ASt4S:
	lea	bx,[pVarBx].ASTAT_ad	;ds:bx = array descriptor address
ASt4:
	call	ResolveArray		;resolve to segment and offset in dx:bx
	GETSEG	ds,dx,di,<SPEED,LOAD>	; Move to array element segment
SStoreR4X:
	pop	[bx]			;Pop first word
	pop	[bx+2]			;Pop second word
	    mov     ax,ss
	    mov     ds,ax		;Restore the data segment
	DispMac

;Added with [15]
subttl	R4 Store Executors
page
;Common
MakeExe exAIdECStR4,opAIdSt,ET_R4
	SkipExHeader
MakeExe exAIdICStR4,opAIdSt,ET_Imp
	LODSWTX 			;Load argument count
	xchg	ax,cx
	LODSWTX				;Get oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	dx,[pVarBx].ACOM_oValue		;Offset into common block
	test	byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC 
						;Is the array $STATIC?
	mov	bx,[pVarBx].ACOM_oCommon	;oCommon
	jz	@F
	add	bx,COM_bdType - COM_bdValue	;Adjust to point to type table
@@:
	add	bx,[grs.GRS_bdtComBlk.BD_pb]	;pCommon
	mov	bx,[bx].COM_bdValue.BD_pb	;Common block
	add	bx,dx				;Offset in block
	jmp	short AStR4

;Indirect
MakeExe exAIdEIStR4,opAIdSt,ET_R4
	SkipExHeader
MakeExe exAIdIIStR4,opAIdSt,ET_Imp
	LODSWTX 			;Index argument count
	xchg	ax,cx
	LODSWTX 			;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	GetpFrame
	mov	bx,[pFrame]		;bx = pointer to array descriptor
	cmp	cl,[bx].AD_cDims	;Correct number of indices?
	jz	AStR4
	jmp	IndexCountErr

;Frame
MakeExe exAIdEFStR4,opAIdSt,ET_R4
	SkipExHeader
MakeExe exAIdIFStR4,opAIdSt,ET_Imp
	LODSWTX 			    ;Index argument count
	xchg	ax,cx
	LODSWTX 			    ;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	bx,[pVarBx+AFRAME_oFrame]   
	add	bx,bp			    ;bx = pointer to array descriptor
	jmp	short AStR4

	;Public


;Static
MakeExe exAIdESStR4,opAIdSt,ET_R4
	SkipExHeader
MakeExe exAIdISStR4,opAIdSt,ET_Imp
	LODSWTX 			;Load argument count
	xchg	ax,cx
	LODSWTX 			;Operand
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
AStR4S:
	lea	bx,[pVarBx].ASTAT_ad	;ds:bx = array descriptor address
AStR4:
	call	ResolveArray		;resolve to segment and offset in dx:bx
	GETSEG	ds,dx,di,<SPEED,LOAD>	; Move to array element segment
	fstp	dword ptr [bx]
	    mov     ax,ss
	    mov     ds,ax		;Restore the data segment
	fwait
	DispMac

;End of [15]


;Added with [15]
subttl	R8 Load Executors
page
;Common
MakeExe exAIdECLdR8,opAIdLd,ET_R8
	SkipExHeader
MakeExe exAIdICLdR8,opAIdLd,ET_Imp
	LODSWTX 				;Load argument count
	xchg	ax,cx
	LODSWTX 				;Get oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	dx,[pVarBx].ACOM_oValue	;Offset into common block
	test	byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC 
						;Is the array $STATIC?
	mov	bx,[pVarBx].ACOM_oCommon	;oCommon
	jz	@F
	add	bx,COM_bdType - COM_bdValue	;Adjust to point to type table
@@:
	add	bx,[grs.GRS_bdtComBlk.BD_pb]	;pCommon
	mov	bx,[bx].COM_bdValue.BD_pb	;Common block
	add	bx,dx				;Offset in block
	jmp	short ALdR8

;Indirect
MakeExe exAIdEILdR8,opAIdLd,ET_R8
	SkipExHeader
MakeExe exAIdIILdR8,opAIdLd,ET_Imp		
	LODSWTX 				;Index argument count
	xchg	ax,cx
	LODSWTX 				;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	GetpFrame
	mov	bx,[pFrame]			;bx points to array descriptor
	cmp	cl,[bx].AD_cDims		;Correct number of indices?
	jz	ALdR8				
	jmp	IndexCountErr

;Frame
MakeExe exAIdEFLdR8,opAIdLd,ET_R8
	SkipExHeader
MakeExe exAIdIFLdR8,opAIdLd,ET_Imp		
	LODSWTX 		;Index argument count
	xchg	ax,cx
	LODSWTX 		;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	bx,[pVarBx+AFRAME_oFrame]
	add	bx,bp		;bx = pointer to array descriptor
	jmp	short ALdR8			

;Public

;Static
MakeExe exAIdESLdR8,opAIdLd,ET_R8
	SkipExHeader
MakeExe exAIdISLdR8,opAIdLd,ET_Imp	
	LODSWTX 			;Load argument count
	xchg	ax,cx
	LODSWTX 			;Operand
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
ALdR8S:
	lea	bx,[pVarBx].ASTAT_ad	; ds:bx = array descriptor address
ALdR8:					
	call	ResolveArray		;resolve to segment and offset in dx:bx
	GETSEG	ds,dx,di,<SPEED,LOAD>	; Move to array element segment
	fld	qword ptr [bx]
	    mov     ax,ss
	    mov     ds,ax		;Restore the data segment
	DispMac

;End of [15]


;Start of [15]
subttl	R8 Store Executors
page
;Indirect
MakeExe exAIdEIStR8,opAIdSt,ET_R8
	SkipExHeader
MakeExe exAIdIIStR8,opAIdSt,ET_Imp		
	LODSWTX 				;Index argument count
	xchg	ax,cx
	LODSWTX 				;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	GetpFrame
	mov	bx,[pFrame]			;bx points to array descriptor
	cmp	cl,[bx].AD_cDims		;Correct number of indices?
	jz	AStR8				
	jmp	IndexCountErr

;Common
MakeExe exAIdECStR8,opAIdSt,ET_R8
	SkipExHeader
MakeExe exAIdICStR8,opAIdSt,ET_Imp		
	LODSWTX 				;Load argument count
	xchg	ax,cx
	LODSWTX 				;Get oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	dx,[pVarBx].ACOM_oValue	;Offset into common block
	test	byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC 
						;Is the array $STATIC?
	mov	bx,[pVarBx].ACOM_oCommon	;oCommon
	jz	@F
	add	bx,COM_bdType - COM_bdValue	;Adjust to point to type table
@@:

	add	bx,[grs.GRS_bdtComBlk.BD_pb]	;pCommon
	mov	bx,[bx].COM_bdValue.BD_pb	;Common block
	add	bx,dx				;Offset in block
	jmp	short AStR8			

;Frame
MakeExe exAIdEFStR8,opAIdSt,ET_R8
	SkipExHeader
MakeExe exAIdIFStR8,opAIdSt,ET_Imp		
	LODSWTX 				;Index argument count
	xchg	ax,cx
	LODSWTX 				;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	bx,[pVarBx+AFRAME_oFrame]	
	add	bx,bp		;bx = pointer to array descriptor
	jmp	short AStR8			;jmp is faster from here

;Public

;Static
MakeExe exAIdESStR8,opAIdSt,ET_R8
	SkipExHeader
MakeExe exAIdISStR8,opAIdSt,ET_Imp	
	LODSWTX 			;Load argument count
	xchg	ax,cx
	LODSWTX 			;Operand
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
AStR8S:
	lea	bx,[pVarBx].ASTAT_ad	; ds:bx = array descriptor address
AStR8:					
	call	ResolveArray		;resolve to segment and offset in dx:bx
	GETSEG	ds,dx,di,<SPEED,LOAD>	; Move to array element segment
	fstp	qword ptr [bx]
	    mov     ax,ss
	    mov     ds,ax		;Restore the data segment
	fwait
	DispMac

;End of [15]

subttl	Sd Load Executors
page
;Common
MakeExe exAIdECRfSD,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdICRfSD,opAIdLd,ET_Imp
	LODSWTX 				;Load argument count
	xchg	ax,cx
	LODSWTX 				;Get oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	dx,[pVarBx].ACOM_oValue		;Offset into common block
	test	byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC 
						;Is the array $STATIC?
	mov	bx,[pVarBx].ACOM_oCommon	;oCommon
	jz	@F
	add	bx,COM_bdType - COM_bdValue	;Adjust to point to type table
@@:

	add	bx,[grs.GRS_bdtComBlk.BD_pb]	;pCommon
	mov	bx,[bx].COM_bdValue.BD_pb	;Common block
	add	bx,dx				;Offset in block
	jmp	short ALdSd

;Indirect
MakeExe exAIdEIRfSD,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdIIRfSD,opAIdLd,ET_Imp
	LODSWTX 			;Index argument count
	xchg	ax,cx
	LODSWTX 			;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	GetpFrame
	mov	bx,[pFrame]		;bx = pointer to array descriptor
	cmp	cl,[bx].AD_cDims	;Correct number of indices?
	jz	ALdSD
	jmp	IndexCountErr

;Frame
MakeExe exAIdEFRfSD,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdIFRfSD,opAIdLd,ET_Imp
	LODSWTX 			;Index argument count
	xchg	ax,cx
	LODSWTX 			;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	bx,[pVarBx+AFRAME_oFrame]
	add	bx,bp			;bx = pointer to array descriptor
	jmp	short ALdSD

;public


;Static
MakeExe exAIdESRfSD,opAIdLd,ET_SD
	SkipExHeader
MakeExe exAIdISRfSD,opAIdLd,ET_Imp
	LODSWTX 			;Load argument count
	xchg	ax,cx
	LODSWTX 			;Operand
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	lea	bx,[pVarBx].ASTAT_ad	; ds:bx = array descriptor address
ALdSd:
	call	ResolveArray		;resolve to segment and offset in dx:bx
	push	bx			;Load pointer to SD
	DispMac

subttl	Sd Store Executors
page
;Common
MakeExe exAIdECStSD,opAIdSt,ET_SD
	SkipExHeader
MakeExe exAIdICStSD,opAIdSt,ET_Imp
	LODSWTX 				;Load argument count
	xchg	ax,cx
	LODSWTX 				;Get oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	mov	dx,[pVarBx].ACOM_oValue		;Offset into common block
	test	byte ptr [pVarBx-VAR_value].VAR_fStat,FV_STATIC 
						;Is the array $STATIC?
	mov	bx,[pVarBx].ACOM_oCommon	;oCommon
	jz	@F
	add	bx,COM_bdType - COM_bdValue	;Adjust to point to type table
@@:

	add	bx,[grs.GRS_bdtComBlk.BD_pb]	;pCommon
	mov	bx,[bx].COM_bdValue.BD_pb	;Common block
	add	bx,dx				;Offset in block
	jmp	short AStSD

;Indirect
MakeExe exAIdEIStSD,opAIdSt,ET_SD
	SkipExHeader
MakeExe exAIdIIStSD,opAIdSt,ET_Imp
	LODSWTX 			;Index argument count
	xchg	ax,cx
	LODSWTX 			;oVar
	xchg	ax,bx			; BX = oVar
	DbChk	oVar,bx 		; Check for valid oVar
	GetpFrame
	mov	bx,[pFrame]		;bx = pointer to array descriptor
	cmp	cl,[bx].AD_cDims	;Correct number of indices?

⌨️ 快捷键说明

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