第6章 程序的基本结构

在前面几章,我们分别介绍了用汇编语言进行程序设计所需要的几个最基本的知识:内存单元的寻址方式变量定义各种汇编指令格式。在掌握了这些基本内容之后,就需要学习如何把它们组成一个完整的汇编语言程序。

6.1 源程序的基本组成

汇编语言源程序的组成部分有:模块、段、子程序等。一个模块对应一个目标文件,当开发较大型的应用程序时,该程序可能由若干个目标文件或库结合而成的。有关模块和子程序的知识和宏在第7章介绍,有关宏的知识将在第9章中叙述。

6.1.1 段的定义

微机系统的内存是分段管理的,为了与之相对应,汇编语言源程序也分若干个段来构成。8086CPU有四个段寄存器,在该系统环境下运行的程序在某个时刻最多可访问四个段,而80386及其以后的CPU都含有六个段寄存器,于是,在这些系统环境下开发的运行程序在某个时刻最多可访问六个段。

不论程序在某个时刻最多能访问多少个段,在编程序时,程序员都可以定义比该段数更多的段。在通常情况下,一个段的长度不能超过64K,在80386及其以后系统的保护方式下,段基地址是32位,段的最大长度可达4G

段的长度是指该段所占的字节数:

、如果段是数据段,则其长度是其所有变量所占字节数的总和;
、如果段是代码段,则其长度是其所有指令所占字节数的总和。

在定义段时,每个段都有一个段名。在取段名时,要取一个具有一定含义的段名。

段定义的一般格式如下:

段名 SEGMENT [对齐类型]  [组合类型]  [类别]
;段内的具体内容
段名 ENDS

其中:“段名”必须是一个合法的标识符,前后二个段名要相同。可选项“对齐类型”、“组合类型”和“类别”的说明作用请见6.3节中的叙述。

一个数据段的定义例子:

DATA1 SEGMENT
word1 DW 1, 9078H, ?
byte1 DB 21, 'World'
DD 12345678H
DATA1 ENDS


一个代码段的例子:

CODE1 SEGMENT
MOV AX, DATA1 ;把数据段DATA1的段值送AX
MOV DS, AX ;把AX的值送给DS,即:DS存储数据段的段值
MOV AX, 4C00H
INT 21H ;调用DOS功能,结束程序的运行
CODE1 ENDS