程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> 匯編源碼系列之basmain

匯編源碼系列之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!


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved