汇编源码系列之basmain2008-04-30这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... extrn $$main:far cseg segment para public "code" ; This program is used to set the PSP address for a compiled BASIC program. ; The PSP segment is saved at 0:4F2H. ; It can also be used to limit the maximum memory available to a compiled ; BASIC program. The option "/M:nnn" is used on the command line, where ; nnn is the number of K-bytes the program is limited to. If no, /M option ; is specified, no memory limitation takes place. For example, "/M:64" would ; limit the program to 64*1024 bytes. The range for nnn is 64 to 1024. ; This routine gets control before BASIC, does its handiwork, and then ; passes control to the BASIC program. It must be linked as follows: ; LINK BASMAIN+yourprog,yourprog,NUL.MAP,BASCOM ; If BASMAIN is unable to limit memory as requested, a message is displayed ; and the execution of the program is continued. public basmain basmain proc far assume cs:cseg,ds:cseg,ss:nothing,es:nothing push ds ; save ds xor ax,ax mov ds,ax ; ds=0 mov si,4f2h ; dos communications area mov ax,es ; get psp seg mov [si],ax ; save psp in dos comm area pop ds ; restore ds mov si,80h ; point to command line mov ch,0 mov cl,[si] ; get length of command line jcxz p025 ; it"s zero p010: inc si mov al,[si] ; get char from command line cmp al,"/" ; is it a slash? jnz p020 ; no mov ax,[si+1] ; get next 2 chars cmp ax,":M" ; is it M: ? jz p030 ; yes cmp ax,":m" ; is it m: ? jz p030 ; yes p020: loop p010 ; check next char p025: jmp p080 ; no /m: or /M: found p030: ; found /m: or /M: add si,3 ; point to first number mov ax,0 mov bx,0 mov cx,10 p040: mov bl,[si] ; get character cmp bl,"0" ; out of range? jb p050 ; yes cmp bl,"9" ; out of range? ja p050 ; yes sub bl,"0" ; convert to binary mul cx ; multiply ax by 10 add ax,bx ; add new digit inc si ; point to next char jmp p040 ; continue p050: ; got value in ax cmp ax,64 ; less than 64K? jb p060 ; yes - print msg cmp ax,1024 ; greater than 1024K? ja p060 ; yes - print msg mov cl,6 sal ax,cl ; convert from KB to paragraphs (*64) mov bx,es ; get psp add bx,ax ; new top of memory mov si,2 ; point to top of memory in psp mov ax,[si] ; get current top of memory cmp ax,bx ; is new setting larger? jae p055 ; no mov dx,offset msg2 ; yes - print msg jmp p065 p055: mov [si],bx ; save new top of memory jmp p080 p060: mov dx,offset msg1 ; print the message p065: add dx,100h ; fudge for the psp mov ah,9 int 21h p080: jmp $$main ; jump to BASIC"s start point msg1 db "Memory specification must be from 64 to 1024",7,10,13,"$" msg2 db "Unable to limit memory",7,10,13,"$" basmain endp cseg ends end basmain ; must be a main program!