WEB开发网
开发学院软件开发汇编语言 汇编源码系列之basmain 阅读

汇编源码系列之basmain

 2008-04-29 09:34:30 来源:WEB开发网   
核心提示:这个都是过去DOS时代的汇编源码,虽然已经过去了,汇编源码系列之basmain,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言

这个都是过去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!


Tags:汇编 源码 系列

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接