灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:5161回复:0

[汇编源码]汇编源码--basmain

楼主#
更多 发布于:2011-10-26 09:22
[pre]
extrn    $$main:farcseg    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    basmainbasmain 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 zerop010:    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         ; yesp020:    loop p010        ; check next charp025:    jmp p080        ; no /m: or /M: foundp030:                ; found /m: or /M:    add si,3        ; point to first number    mov ax,0    mov bx,0    mov cx,10p040:    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        ; continuep050:                ; 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 p065p055:    mov [si],bx        ; save new top of memory    jmp p080p060:    mov dx,offset msg1    ; print the messagep065:    add dx,100h        ; fudge for the psp    mov ah,9    int 21hp080:    jmp $$main        ; jump to BASIC's start pointmsg1    db 'Memory specification must be from 64 to 1024',7,10,13,'$'msg2    db 'Unable to limit memory',7,10,13,'$'basmain endpcseg    endsend    basmain         ; must be a main program!
[/pre]

喜欢0 评分0
游客

返回顶部