汇编语言之程序的基本结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第6章程序的基本结构
在前面几章,我们分别介绍了用汇编语言进行程序设计所需要的几个最基本的知识:存单元的寻址方式,变量定义和各种汇编指令格式。在掌握了这些基本容之后,就需要学习如何把它们组成一个完整的汇编语言程序。
6.1 源程序的基本组成
汇编语言源程序的组成部分有:模块、段、子程序和宏等。一个模块对应一个目标文件,当开发较大型的应用程序时,该程序可能由若干个目标文件或库结合而成的。有关模块和子程序的知识和宏在第7章介绍,有关宏的知识将在第9章中叙述。
6.1.1 段的定义
微机系统的存是分段管理的,为了与之相对应,汇编语言源程序也分若干个段来构成。8086CPU有四个段寄存器,在该系统环境下运行的程序在某个时刻最多可访问四个段,而80386及其以后的CPU都含有六个段寄存器,于是,在这些系统环境下开发的运行程序在某个时刻最多可访问六个段。
不论程序在某个时刻最多能访问多少个段,在编程序时,程序员都可以定义比该段数更多的段。在通常情况下,一个段的长度不能超过64K,在80386及其以后系统的保护方式下,段基地址是32位,段的最大长度可达4G。
段的长度是指该段所占的字节数:
、如果段是数据段,则其长度是其所有变量所占字节数的总和;
、如果段是代码段,则其长度是其所有指令所占字节数的总和。
在定义段时,每个段都有一个段名。在取段名时,要取一个具有一定含义的段名。
段定义的一般格式如下:
段名 SEGMENT [对齐类型] [组合类型] [类别]
…;段的具体容
…
段名 ENDS
其中:“段名”必须是一个合法的标识符,前后二个段名要相同。可选项“对齐类型”、“组合类型”和“类别”的说明作用请见6.3节中的叙述。
一个数据段的定义例子:
DATA1 S EGMENT
word1 D W 1, 9078H, ?
byte1 D B 21, 'World'
DD 12345678H
DATA1 E NDS
一个代码段的例子:
CODE1 S EGMENT
MOV AX, DATA1 ;把数据段DATA1的段值送AX
MOV DS, AX ;把AX的值送给DS,即:DS存储数据段的段值
…
MOV AX, 4C00H
INT 21H ;调用DOS功能,结束程序的运行
CODE1 E NDS
6.1.2 段寄存器的说明语句
在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一种对应关系。建立这种对应关系的说明语句格式如下:
ASSUME 段寄存器名:段名[, 段寄存器名:段名, ……]
其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定义语句说明时的段名。
在一条ASSUME语句中可建立多组段寄存器与段之间的关系,每种对应关系要用逗号分隔。例如,
ASSUME CS:CODE1, DS:DATA1
上面的语句说明了:CS对应于代码段CODE1,DS对应于数据段DATA1。
在ASSUME语句中,还可以用关键字NOTHING来说明某个段寄存器不与任何段相对应。下面语句说明了段寄存器ES不与某段相对应。
ASSUME ES:NOTHING
在通常情况下,代码段的第一条语句就是用ASSUME语句来说明段寄存器与段之间的对应关系。在代码段的其它位置,还可以用另一个ASSUME语句来改变前面ASSUME语句所说明的对应关系,这样,代码段中的指令就用最近的ASSUME 语句所建立的对应关系来确定指令中的有关信息。
例6.1 汇编语言段及其段说明语句的作用。
DATA1 S EGMENT
;定义数据段DATA1
word1 DW 5678h byte1 DB "ABCDEFG" DATA1 E NDS DATA2 S EGMENT
;定义数据段DATA2
word2 DW 1234h word3 DW 9876h DATA2 E NDS DATA3 S EGMENT
;定义数据段DATA3
byte2 DB ? DATA3 E NDS CODE1 S EGMENT
;编写代码段CODE1 ASSUME
CS:CODE1, DS:DATA1, ES:DATA2 ;(1) MOV AX, DATA1 ;(2) MOV DS, AX ;(3) MOV AX, DATA2 ;(4) MOV ES, AX ;(5)
…
MOV AX, word1 ;访问段DATA1中的字变量word1 MOV word2, AX ;访问段DATA2中的字变量word2 … ASSUME D S:DATA3, ES:NOTHING ;(6)
MOV AX, DATA3 MOV DS, AX
MOV
BL, byte2
;访问段DATA3中的字节变量byte2 …
MOV AX, 4C00H ;(7) INT 21H ;(8)
CODE1 ENDS
语句(1)和(6)分别说明了段和段寄存器之间的对应关系,其中语句(6)重新说明语句(1)所指定的对应关系。
二组语句(2)和(3)、(4)和(5)实现对段寄存器DS 和ES 赋初值。ASSUME 说明语句只起说明作用,它不会对段寄存器赋值,所以,必须对有关段寄存器赋值。在以后的其它源程序中也都是用此方法来实现对数据段寄存器赋值的。 语句(7)和(8)是调用中断21H 的4CH 号功能来结束本程序的执行,程序的返回代码由寄存器AL 来确定。结束本程序执行的指令是所有主模块必须书写的语句。
注意:代码段寄存器不能由程序员在源程序中对其赋值,其值是由操作系统在装入它进入系统运行时自动赋值的。