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