目录 上一页 下一页 下一章

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








MAIN
CODE

OR
OUT
MOV
INT
POP
OUT
RET
ENDP
ENDS
END
AL,3
61H,AL
AH,1
21H
AX
61H,AL



MAIN
;将61H端口的低2位改为1
;打开定时器及与门
;选择DOS API的01号功能
;调用21H中断等待键盘输入
;取回61H端口的原状态
;关闭定时器及与门

;主过程结束
;代码段结束
;进程结束
  这个程序看上去很眼熟吧,它就是PROG6的源程序形式,不过和PROG6相比,它有点面目全非了。我们先来讨论一个简单的问题:源程序中的数。
  采用DEBUG编程时所用的数都是16进制的,如果需要使用其它进制的数,程序员就必须自己将其转换为16进制。而编制汇编源程序则没有这个烦琐的问题,我们可以在源程序中使用任意进制的数,只需在数的末尾给出进制标识即可。
除了前面讲过十六进制数末尾加"H"之外,汇编语言还规定二进制数末尾要加"B"(Binary),八进制数加"O"(Octal),十进制数加"D"(Decimal)。不过有两点需要注意的地方:
① 若一个数末尾不加任何标识,则编译程序默认这个数为十进制;
② 以A-F打头的十六进制数前要补"0"。1111B、15、15D、17O、0FH表示的是同一个数。
  在PROG7.ASM中,幻数用二进制数10110110B表示,端口地址都用了十六进制数,而系统功能都用了十进制数。编译程序将自动处理这些不同进制的数据。
  在程序头部的尾部还新增了不少"伪操作",伪操作的概念在第三章中已讨论过,它虽然和指令写在一起,但它并不是写给CPU的,而是写给编译系统的。当应用DEBUG编程时这些伪操作要由DEBUG完成,现在要使用真正的汇编语言编译系统,伪操作自然要由编译程序完成。我们先来讨论程序的第一行和倒数第二行:

CODE SEGMENT
  "SEGMENT"是"段定义"伪操作,它表示一个段的开始。其中"CODE"是这个段的名字,表示这个段的段地址。名字可以是除了汇编语言保留字之外的任何字符串,但要注意打头的字母不能是数字。

  为什么要定义段?以前应用DEBUG编制程序时我们并未考虑分段的问题,所有的数据和指令都在一个段内,这就有这样一个问题,一个段长度只有64K,也就是说用DEBUG编制的程序长度不能超过64K,再明确一点,凡是".COM"类的可执行文件都不能大于64K。这个限制使".COM"类文件的应用范围受到制约。
  如何突破64K的限制?可以设想只要把代码、数据和堆栈分别放入不同的段内,甚至把代码中的各个子程序(模块)也分散到不同的段内,这样就可以使程序超出64K,这就是".EXE"文件的结构。因此在编制源程序的时候就需要定义不同的段。

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章