-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 |