目录 上一页 下一页 附录A

-308- PC机汇编语言实战精解




main
code

int

ret
endp
ends
end
21h




main


;结束进程



  程序看上去很简单,只是普通地用DB伪指令在数据段内开辟一个32KB的缓冲区。实际上这个程序编译连接成可执行文件后就会曝露出一个问题:
  所谓的问题就是这个EXE文件好象有点太大了,竟然有30多KB,而源程序中的代码并不多,无非是显示一个字符串而已。这30多KB又从何而来呢?
  如果去掉源程序中"BUFFER DB..."一行再进行编译连接,那么生成的EXE文件长度会迅速缩短到1KB多。实际上用DB伪指令开辟的缓冲区最终要包含在EXE文件里,每多"DB"一个字节,则最终的EXE文件就要增加一个字节。看来如果程序需要很大的缓冲区,采用传统的程序设计方法会显著增加可执行文件的长度。
  如何解决这个问题?我们知道"操作系统"的一个重要特征就是可以对各种"资源"进行有效地管理。这里的"资源"指得是各种数据(文件)及系统安装的各类设备。毫无疑问内存也属于设备,它也应该受到操作系统很好地管理。
  我们现在所依靠的操作系统--DOS就具备管理内存的能力。应用程序可以通过系统功能调用向DOS申请一些内存,结束之前还可以通过系统功能把"借"来的内存"还"给DOS,从而可以不用DB伪指令在数据段里定义缓冲区。
  48H功能就是DOS提供的用于申请内存的功能调用:
功能号:48H
用 途:向DOS申请一定量连续内存空间
参 数:AH=48H
    BX=申请内存的"节"数
调 用:INT 21H
返 回:如果成功,则CF清零,AX=申请到的内存块段地址
    如果失败,则CF置1,AX=错误代码,BX=当前内存最大可用块的大小
    AX=07H 内存控制块被破坏
      08H 内存不够

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 附录A