您的位置:逆风者 汇编技术 正文
原作者:www.upwinder.com 添加时间:2007-09-02 原文发表:2007-08-31 人气:2来源:未知


; EXECSUB - execute program from compiled BASIC - requires DOS 2.00

; This version allows one BASIC program to call another

;

; CALL EXECSUB(PROG$,PARM$,FCB1$,FCB2$,RETCD%)

; PROG$ is the program name (e.g. 'command.com')

; PARM$ is the parameter to be passed to the program (e.g. '/c dir *.bas')

; FCB1$ is the first file control block (required by some programs)

; FCB2$ is the second file control block (required by some programs)

; RETCD% is the error return code



	skip equ 2		; 1 for interpretive, 2 for compiled



cseg	segment para public 'code'

public	execsub

execsub proc far



	assume cs:cseg,ds:cseg,ss:nothing,es:nothing



basicds equ 510h

i24ip	equ 90h

i24cs	equ 92h

i1bip	equ 6ch

i1bcs	equ 6eh

i1cip	equ 70h

i1ccs	equ 72h



b24ip	equ 51ah

b24cs	equ 51ch

b1bip	equ 516h

b1bcs	equ 518h

b1cip	equ 512h

b1ccs	equ 514h



	push bp

	mov bp,sp

	jmp p010



stak	equ this byte

	dw 0			; save sp

	dw 0			; save ss



prm1	equ this byte

	dw 0			; environment

prm2	equ this word

	dw 0			; command line - ip & cs

	dw 0

prm3	equ this byte

	dw 0			; default FCB - ip & cs

	dw 0

prm4	equ this byte

	dw 0			; second default FCB - ip & cs

	dw 0



p010:

	xor ax,ax		; get psp

	mov es,ax		; es=0

	mov bx,ds		; save ds

	mov ds,ax		; ds=0

	cli



	push ds:[basicds]	; save basic's ds



	push ds:[i24ip] 	; save int 24h and shadow

	push ds:[b24ip]

	push ds:[b24ip]

	pop ds:[i24ip]



	push ds:[i24cs]

	push ds:[b24cs]

	push ds:[b24cs]

	pop ds:[i24cs]



	push ds:[i1bip] 	; save int 1bh and shadow

	push ds:[b1bip]

	push ds:[b1bip]

	pop ds:[i1bip]



	push ds:[i1bcs]

	push ds:[b1bcs]

	push ds:[b1bcs]

	pop ds:[i1bcs]



	push ds:[i1cip] 	; save int 1ch and shadow

	push ds:[b1cip]

	push ds:[b1cip]

	pop ds:[i1cip]



	push ds:[i1ccs]

	push ds:[b1ccs]

	push ds:[b1ccs]

	pop ds:[i1ccs]



	sti

	mov ds,bx		; restore ds



	mov di,4f2h		; point to dos comm. area

	mov ax,es:[di]		; get psp segment

	mov es,ax

	mov di,2

	mov bx,es:[di]		; get top of memory

	sub bx,ax		; subtract psp

	mov ah,4ah

	int 21h 		; free memory

	jnc p020		; no error

	mov ah,0		; memory error

	jmp p090		; to error control



p020:	mov si,[bp 12]		; point to parm$

	add si,skip

	mov ax,[si]

	mov si,offset prm2	; establish command line

	mov cs:[si],ax

	mov ax,ds

	mov cs:[si 2],ax



	mov si,[bp 10]		; point to fcb1$

	add si,skip

	mov ax,[si]

	mov si,offset prm3

	mov cs:[si],ax

	mov ax,ds

	mov cs:[si 2],ax



	mov si,[bp 8]		; point to fcb2$

	add si,skip

	mov ax,[si]

	mov si,offset prm4	; establish second fcb

	mov cs:[si],ax

	mov ax,ds

	mov cs:[si 2],ax



	push bp 		; save registers

	push ds

	push es

	pushf

	mov si,offset stak	; save stack

	mov cs:[si],sp

	mov cs:[si 2],ss



	mov ah,4bh		; load prog

	mov al,0		; load & execute

	mov si,[bp 14]		; point to prog$

	add si,skip

	mov dx,[si]

	push cs

	pop es

	mov bx,offset prm1	; point to parameter

	int 21h 		; load & execute program

	jnc p050		; no error

	mov ah,1		; set error code

	jmp p060



p050:	mov ax,0		; clear error



p060:	mov bx,cs		; restore stack

	mov ds,bx

	mov si,offset stak

	cli			; no interrupts

	mov sp,cs:[si]

	mov ss,cs:[si 2]

	sti			; allow interrupts



	popf			; restore registers

	pop es

	pop ds

	pop bp



	mov cx,ds		; save ds

	xor bx,bx

	mov ds,bx		; ds=0

	cli



	pop ds:[b1ccs]		; restore int 1ch

	pop ds:[i1ccs]

	pop ds:[b1cip]

	pop ds:[i1cip]



	pop ds:[b1bcs]		; restore int 1bh

	pop ds:[i1bcs]

	pop ds:[b1bip]

	pop ds:[i1bip]



	pop ds:[b24cs]		; restore int 24h

	pop ds:[i24cs]

	pop ds:[b24ip]

	pop ds:[i24ip]



	pop ds:[basicds]	; restore basic's ds

	sti

	mov ds,cx



p090:	mov si,[bp 6]		; point to RETCD%

	mov [si],ax		; return error, if any



	pop bp			; return to caller

	ret 10



execsub endp

cseg	ends

end

 

本页地址
相关文章

FASTREBOOT V1.0
汇编源码--CLOCK
汇编源码--CALC
V86模式切换程序
汇编源码--break
MAKE SOUNDS (发声)
获得操作系统版本的汇编源代码
汇编源码--drivesex
输入10进制,输出2进制
汇编源码--sound
CIH V1.5版本病毒源码
获取当前系统时间
The 808 Virus
汇编源码--getseg_c
汇编源码--ctrladel
一个旋转的3D箱子(动画)
汇编源码--inthand
PRINT FILE PROGRAM (打印文件)
汇编源码--COBLOAD
汇编源码--circle

相关评论


本文章所属分类:首页 汇编技术