文档介绍:汇编语言程序设计汇编语言程序设计
吴向军
中山大学计算机科学系
中山大学计算机科学系
2
第6章程序的基本结构
源程序的基本组成
段的定义
在定义段时,每个段都有一个段名。在取段名时,要取一个具有一定含义
的段名。段定义的一般格式如下:
段名 SEGMENT [对齐类型] [组合类型] [类别]
…;段内的具体内容
段名 ENDS
其中:“段名”必须是一个合法的标识符,前后二个段名要相同。可选项“对
齐类型”、“组合类型”和“类别”。
段的长度是指该段所占的字节数:
如果段是数据段,则其长度是其所有变量所占字节数的总和;
如果段是代码段,则其长度是其所有指令所占字节数的总和。
在通常情况下,一个段的长度不能超过64K,在80386及其以后系统的保护
方式下,段基地址是32位,段的最大长度可达4G。
中山大学计算机科学系
3
第6章程序的基本结构
一个数据段的定义例子:
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
中山大学计算机科学系
4
第6章程序的基本结构
段寄存器的说明语句
在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一
种对应关系。建立这种对应关系的说明语句格式如下:
ASSUME 段寄存器名:段名[, 段寄存器名:段名, ……]
其中:段寄存器是CS、DS、ES、SS、FS和GS,段名在段定义语句说明。
例如,
ASSUME CS:CODE1, DS:DATA1
说明了:CS对应于代码段CODE1,DS对应于数据段DATA1。
在ASSUME语句中,还可以用关键字NOTHING来说明某个段寄存器不与
任何段相对应。下面语句说明了段寄存器ES不与某段相对应。
ASSUME ES:NOTHING
在通常情况下,代码段的第一条语句就是用ASSUME语句来说明段寄存器
与段之间的对应关系。
在代码段的其它位置,还可以用另一个ASSUME语句来改变前面ASSUME
语句所说明的对应关系,这样,代码段中的指令就用最近的ASSUME语句所建
立的对应关系来确定指令中的有关信息。
中山大学计算机科学系
5
第6章程序的基本结构
:汇编语言段及其段说明语句的作用。
DATA1 SEGMENT ;定义数据段DATA1
word1 DW 5678h
byte1 DB “ABCDEFG”
CODE1 SEGMENT ;编写代码段CODE1
DATA1 ENDS
ASSUME CS:CODE1, DS:DATA1, ES:DATA2 ;①
DATA2 SEGMENT ;定义数据段DATA2
MOV AX, DATA1 ;②
word2 DW 1234h
MOV DS, AX ;③
word3 DW 9876h
MOV AX, DATA2 ;④
DATA2 ENDS MOV ES, AX ;⑤
DATA3 SEGMENT ;定义数据段DATA3 …
byte2 DB ? MOV AX, word1 ;访问DATA1中的变量word1
DATA3 ENDS MOV word2, AX ;访问DATA2中的变量word2
…
ASSUME DS:DATA3, ES:NOTHING ;⑥
MOV AX, DATA3
MOV DS, AX
MOV BL, byte2 ;访问DATA3中的变量byte2
…
MOV AX, 4C00H ;⑦
INT 21H ;⑧
CODE1 ENDS
中山大学计算机科学系
6
第6章程序的基本结构
堆栈段的说明
在源程序中,可用以下方法来定义堆栈段。
方法1:
Stack1 SEGMENT
DB 256 DUP(?) ;256是堆栈的长度,可根据需要进行改变
TOP LABEL WORD
Stack1 ENDS
由于堆栈是按地址从大到小的存储