《第5章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《第5章汇编语言程序设计.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5章汇编语言程序设计章汇编语言程序设计5.1汇编语言的程序与语句汇编语言的程序与语句5.2汇编语言的伪指令汇编语言的伪指令5.3汇编语言程序设计基础汇编语言程序设计基础5.4中断服务程序设计中断服务程序设计5.5模块化程序设计模块化程序设计 5.1汇编语言的程序与语句汇编语言的程序与语句5.1.1 汇编语言源程序的格式汇编语言源程序的格式 一个汇编语言源程序由若干个逻辑段组成,每个逻辑段都有一一个汇编语言源程序由若干个逻辑段组成,每个逻辑段都有一个段名,由段定义语句个段名,由段定义语句 SEGMENT 来定义,以来定义,以 ENDS 语句结束。通语句结束。通常,源程序中有代码段、数据段、堆
2、栈段和附常,源程序中有代码段、数据段、堆栈段和附 加数据段。一般来讲,加数据段。一般来讲,代码段是必不可少的。数据段和附加数据段用来在内存中建立一个代码段是必不可少的。数据段和附加数据段用来在内存中建立一个 适适当容量的工作区以存放常量和变量,并作为算术运算或当容量的工作区以存放常量和变量,并作为算术运算或 I/O 接口传送接口传送数据的工作区;堆栈数据的工作区;堆栈 段则是在内存区中建立的一个堆栈区,用以在中段则是在内存区中建立的一个堆栈区,用以在中断和过程(或子程序)调用、各模块之间断和过程(或子程序)调用、各模块之间 传递参数时使用。传递参数时使用。返回下一页5.1汇编语言的程序与语句汇
3、编语言的程序与语句5.1.2 汇编语言的语句汇编语言的语句1语句的种类与格式语句的种类与格式(1)语句的种类)语句的种类汇编语言的语句有汇编语言的语句有 3 种基本类型:种基本类型:指令语句:是可执行语句,由指令语句:是可执行语句,由 CPU 指令组成。汇编时,汇编程序将指指令组成。汇编时,汇编程序将指令语句翻译成相应的机器目标代码。令语句翻译成相应的机器目标代码。伪指令语句:在汇编过程中告诉汇编程序如何进行汇编,如定义数据、伪指令语句:在汇编过程中告诉汇编程序如何进行汇编,如定义数据、分配存储分配存储 空间、定义段以及定义过程等,但不会产生机器目标代码。空间、定义段以及定义过程等,但不会产生
4、机器目标代码。只有通过伪指令的组只有通过伪指令的组 织,指令序列才能够在内存中正确地放置和执行。织,指令序列才能够在内存中正确地放置和执行。上一页返回下一页5.1汇编语言的程序与语句汇编语言的程序与语句宏指令语句:将需多次使用的程序段以某个宏名进行定义(称为宏定宏指令语句:将需多次使用的程序段以某个宏名进行定义(称为宏定义)即可得义)即可得 到一条宏指令语句。每次需要该程序段时,可用宏指令名到一条宏指令语句。每次需要该程序段时,可用宏指令名来代替(称为宏调用)。来代替(称为宏调用)。当汇编程序对这条宏指令语句进行汇编时,当汇编程序对这条宏指令语句进行汇编时,会将该程序段中的指令序列翻译成相会将
5、该程序段中的指令序列翻译成相 应的机器目标代码序列(称为宏应的机器目标代码序列(称为宏展开)。使用宏指令语句可避免重复书写,使源展开)。使用宏指令语句可避免重复书写,使源 程序更加简洁。程序更加简洁。(2)语句的格式)语句的格式汇编语言的语句可以由汇编语言的语句可以由 14 部分组成:部分组成:上一页返回下一页5.1汇编语言的程序与语句汇编语言的程序与语句2语句中的操作数语句中的操作数(1)常量操作数)常量操作数 常量是指令中出现的固定值,常量可分为数值常量和字符串常量,常量是指令中出现的固定值,常量可分为数值常量和字符串常量,无属性。无属性。数值常量:有十进制、二进制、八进制、十六进制等几种
6、表示形数值常量:有十进制、二进制、八进制、十六进制等几种表示形式。汇编语言中式。汇编语言中 的数值常量的首位是数字,如的数值常量的首位是数字,如 B7H 应写成应写成 0B7H;否则,汇编时其将被视为符号。否则,汇编时其将被视为符号。字符串常量:是由单引号括起来的一个或几个字符,如字符串常量:是由单引号括起来的一个或几个字符,如AB、About。字符的值为其。字符的值为其 ASCII 码值。由于在汇编时,字符都以码值。由于在汇编时,字符都以 ASCII 码形式存放在内存单元中,因此,字符串码形式存放在内存单元中,因此,字符串AB与与 4142H 等价。等价。上一页返回下一页5.1汇编语言的程序
7、与语句汇编语言的程序与语句(2)寄存器操作数)寄存器操作数操作数部分是寄存器名,如操作数部分是寄存器名,如 AX、SI、DS、CL 等。等。(3)存储器操作数)存储器操作数 存储器操作数分为标号和变量两种:存储器操作数分为标号和变量两种:标号代表一条指令的符号地址,这个地址一定在代码段内。标号标号代表一条指令的符号地址,这个地址一定在代码段内。标号可作为转移、过程调用或循环控制指令的操作数,如指令可作为转移、过程调用或循环控制指令的操作数,如指令 JMP NEXT 中的中的 NEXT。变量实质上是存放在内存单元中的数据。为了便于访问,变量都变量实质上是存放在内存单元中的数据。为了便于访问,变量
8、都有变量名,变量有变量名,变量 名为存储单元中某个数据区的名字,即数据区的符号名为存储单元中某个数据区的名字,即数据区的符号地址。在指令中,变量名可地址。在指令中,变量名可 作为存储器操作数,其通常都位于数据段作为存储器操作数,其通常都位于数据段或堆栈段中。或堆栈段中。上一页返回下一页5.1汇编语言的程序与语句汇编语言的程序与语句(4)表达式操作数)表达式操作数 汇编语言中的表达式可由各种操作数、运算符和操作符组成。按汇编语言中的表达式可由各种操作数、运算符和操作符组成。按其性质来分,表达式其性质来分,表达式 可以有两种:可以有两种:数值表达式:是指用运算符将数值常量、字符串常量等连接而成数值
9、表达式:是指用运算符将数值常量、字符串常量等连接而成的表达式。汇编的表达式。汇编 时,由汇编程序计算出数值表达式的数值结果,其只时,由汇编程序计算出数值表达式的数值结果,其只有大小,没有属性。有大小,没有属性。地址表达式:是指用运算符或操作符将常量、变量、标号或寄存地址表达式:是指用运算符或操作符将常量、变量、标号或寄存器的内容连接而器的内容连接而 成的表达式。它的值表示存储器地址(偏移地址),成的表达式。它的值表示存储器地址(偏移地址),其具有其具有 3 种属性:段、偏移种属性:段、偏移 量、类型。例如:量、类型。例如:BYTE PTR AX+5;指定;指定 DS 段内的存储单元段内的存储单
10、元AX+5中的内容中的内容 为字节属性。为字节属性。上一页返回下一页5.1汇编语言的程序与语句汇编语言的程序与语句3运算符运算符 MASM 宏汇编中有宏汇编中有 3 种运算符,如种运算符,如表表 5-1 所示。运算符用以实所示。运算符用以实现对操作数的运算。现对操作数的运算。4操作符操作符 操作符用以完成对操作数属性的获取、定义或修改等。操作符操作符用以完成对操作数属性的获取、定义或修改等。操作符可分为分析操作符和合成操作符,如可分为分析操作符和合成操作符,如表表 5-2 所示。所示。5操作符的优先级操作符的优先级 在汇编语言中,当各种运算符或操作符同时出现在一个地址表在汇编语言中,当各种运算
11、符或操作符同时出现在一个地址表达式或数值表达式中时,它们具有不同的优先级,见达式或数值表达式中时,它们具有不同的优先级,见表表 5-3。对于具对于具有相同优先级别的操作,按从左到右的顺序进行运算。有相同优先级别的操作,按从左到右的顺序进行运算。上一页返回5.2 汇编语言的伪指令汇编语言的伪指令5.2.1 符号定义伪指令符号定义伪指令 在汇编语言中,变量名、标号、过程名、指令名、指令助记符、在汇编语言中,变量名、标号、过程名、指令名、指令助记符、寄存器名等统称为符寄存器名等统称为符 号。符号定义伪指令可以为一个符号重新命名。号。符号定义伪指令可以为一个符号重新命名。1表达式赋值伪操作表达式赋值伪
12、操作 EQU 指令格式:符号名指令格式:符号名 EQU 表达式表达式 EQU 用来给表达式赋予一个符号名(可以是变量或标号,这取决用来给表达式赋予一个符号名(可以是变量或标号,这取决于表达式的类型),于表达式的类型),但并不申请分配存储空间;另外,还可以赋予表但并不申请分配存储空间;另外,还可以赋予表达式新的类型属性。此后,程序中凡需要达式新的类型属性。此后,程序中凡需要 用到该表达式之处就可以用用到该表达式之处就可以用表达式名来代替了。表达式名来代替了。指令格式中的表达式可以是任何有效的操作数格式,既可以是数指令格式中的表达式可以是任何有效的操作数格式,既可以是数值常量、变量或标号,也可以是
13、数值表达式、地址表达式。值常量、变量或标号,也可以是数值表达式、地址表达式。返回下一页5.2 汇编语言的伪指令汇编语言的伪指令2等号伪操作等号伪操作 “=”指令格式:指令格式:符号名符号名 =表达式表达式 “=”与与 EQU 的功能类似,也可作为赋值伪操作使用。它们之间的功能类似,也可作为赋值伪操作使用。它们之间的区别是的区别是 EQU 伪操作伪操作 不允许在同一个源程序中对同一个符号重复定不允许在同一个源程序中对同一个符号重复定义,而用义,而用“”定义的符号则允许被重复定定义的符号则允许被重复定 义。由此可见,义。由此可见,EQU 与与“=”不能同时使用。不能同时使用。上一页返回下一页5.2
14、 汇编语言的伪指令汇编语言的伪指令5.2.2 数据定义伪指令数据定义伪指令 数据定义伪指令可用来为一个数据项预置初值(即初始化存储单数据定义伪指令可用来为一个数据项预置初值(即初始化存储单元)、为该数据项分配元)、为该数据项分配 存储单元,并可给这个存储单元指定一个存储单元,并可给这个存储单元指定一个“符符号名号名”,即变量名;另外,数据定义伪指令,即变量名;另外,数据定义伪指令 还可以指定变量的类型。还可以指定变量的类型。汇编时,汇编程序会把初始值装入所定义的存储单元中。汇编时,汇编程序会把初始值装入所定义的存储单元中。指令格式:指令格式:变量名变量名 数据定义符数据定义符 操作数操作数,操
15、作数,操作数,其中,变量名是可选项;操作数是赋给变量的初值,多个相同类其中,变量名是可选项;操作数是赋给变量的初值,多个相同类型的变量可以在一条语句中定义。常用的数据定义符如下:型的变量可以在一条语句中定义。常用的数据定义符如下:上一页返回下一页5.2 汇编语言的伪指令汇编语言的伪指令 DB:定义字节变量(变量类型为:定义字节变量(变量类型为 BYTE),每个字节变量占一个),每个字节变量占一个字节存储单元。字节存储单元。DW:定义字变量(变量类型为:定义字变量(变量类型为 WORD),每个变量占两个字节),每个变量占两个字节存储单元。变量在内存中存放时,遵循存储单元。变量在内存中存放时,遵循
16、“低字节在前,高字节在后低字节在前,高字节在后”的内存存放原则。的内存存放原则。DD:定义双字变量(变量类型为:定义双字变量(变量类型为 DWORD),每个变量占四个),每个变量占四个字节存储单元。变量在字节存储单元。变量在 内存中存放时,同样遵循内存存放原则。内存中存放时,同样遵循内存存放原则。上一页返回下一页5.2 汇编语言的伪指令汇编语言的伪指令5.2.3 段定义伪指令段定义伪指令 程序存储器的物理地址是由段地址和偏移地址组合而成。汇编程程序存储器的物理地址是由段地址和偏移地址组合而成。汇编程序在把源程序转换为序在把源程序转换为 目标文件(目标文件(.OBJ)后,还必须确定标号或变量的)
17、后,还必须确定标号或变量的偏移地址,并且要把有关信息通过目标模偏移地址,并且要把有关信息通过目标模 块传送给连接程序块传送给连接程序LINK,以便连接程序把不同的段和模块连接在一起,形成一个可执行文以便连接程序把不同的段和模块连接在一起,形成一个可执行文 件。件。SEGMENT和和ENDS伪指令用来把程序模块中的语句分成若干个逻辑伪指令用来把程序模块中的语句分成若干个逻辑段。段。指令格式:指令格式:上一页返回下一页5.2 汇编语言的伪指令汇编语言的伪指令 指令功能:指出段名及段的各种属性格,并指示段的起始位置和指令功能:指出段名及段的各种属性格,并指示段的起始位置和结束位置。结束位置。(1)定
18、位类型)定位类型 定位类型有以下定位类型有以下4种:种:BYTE:表明本段以字节方式定位,即段可以从任何地址开始。此时,:表明本段以字节方式定位,即段可以从任何地址开始。此时,本段的起始地址紧接在前一个段的后面。本段的起始地址紧接在前一个段的后面。WORD:表明本段以字方式定位,即段地址必须为偶数。:表明本段以字方式定位,即段地址必须为偶数。PARA:表明本段的起始地址必须以节(:表明本段的起始地址必须以节(1节为节为16个字节)方式定位,个字节)方式定位,即段起始地即段起始地 址的最低的址的最低的16进制数位必须为进制数位必须为0(即(即XXXX0H)。该定位)。该定位类型为隐含类型,可缺省
19、。类型为隐含类型,可缺省。PAGE:表明本段必须以页(:表明本段必须以页(1页为页为256个字节)方式定位,即段起始个字节)方式定位,即段起始地址的最低两个地址的最低两个16进制数位必须为进制数位必须为0(即(即XXX00H)。)。上一页返回下一页5.2 汇编语言的伪指令汇编语言的伪指令(2)组合类型)组合类型 组合类型又称连接类型。它指示连接程序组合类型又称连接类型。它指示连接程序LINK,如何将本模块,如何将本模块与其它模块中的同名段连接起来。组合类型有以下与其它模块中的同名段连接起来。组合类型有以下6种:种:NONE:表明本段与其它段无逻辑关系,具有自己独立的段起始地址。:表明本段与其它
20、段无逻辑关系,具有自己独立的段起始地址。该组合类型为隐含类型,可缺省。该组合类型为隐含类型,可缺省。PUBLIC:表明连接程序:表明连接程序LINK将本段与其它模块中类型为将本段与其它模块中类型为PUBLIC的的同名段,按顺同名段,按顺 序连接成一个大的逻辑段(共用同一段地址),连接顺序连接成一个大的逻辑段(共用同一段地址),连接顺序由连接命令指定。采用序由连接命令指定。采用 PUBLIC组合类型,可将不同模块中相同段组合类型,可将不同模块中相同段名的若干小段拼装成一个大的、具有相名的若干小段拼装成一个大的、具有相 同段起始地址的物理段。同段起始地址的物理段。上一页返回下一页5.2 汇编语言的
21、伪指令汇编语言的伪指令 STACK:与:与PUBLIC的含义相同。但连接时,仅将具有的含义相同。但连接时,仅将具有STACK类型类型的同名段,按的同名段,按 顺序连接成一个大的堆栈段,由各模块共享,并将顺序连接成一个大的堆栈段,由各模块共享,并将SS初始化为这个堆栈段的首地初始化为这个堆栈段的首地 址,将址,将SP初始化为段内最大偏移地址。初始化为段内最大偏移地址。如果在定义堆栈段时没有将其说明为如果在定义堆栈段时没有将其说明为STACK 类型(此时,类型(此时,LINK程序程序会给出一个警告信息:会给出一个警告信息:NO STACK SEGMENT,但该警告,但该警告 并不影响并不影响程序的
22、运行),则需要在程序中用指令设置程序的运行),则需要在程序中用指令设置SS和和SP的值。的值。MEMORY:表明连接程序将该段指定在所有其它段的后面(在高地:表明连接程序将该段指定在所有其它段的后面(在高地址区)。如果址区)。如果 有多个有多个MEMORY类型的逻辑段,则汇编程序将遇到的类型的逻辑段,则汇编程序将遇到的第一个段作为第一个段作为MEMORY段,段,其它段则被当做其它段则被当做COMMON段。段。AT 表达式:可使段的起始地址为由表达式所计算出来的表达式:可使段的起始地址为由表达式所计算出来的16位段地址,位段地址,连接程序将把该段装在由此段基址所指定的内存中。连接程序将把该段装在
23、由此段基址所指定的内存中。上一页返回下一页5.2 汇编语言的伪指令汇编语言的伪指令(3)类别名)类别名 在连接几个程序模块时,连接程序会将类别名相同的所有逻辑段,在连接几个程序模块时,连接程序会将类别名相同的所有逻辑段,依次存放在连续的内依次存放在连续的内 存区中,但它们仍然是不同的段;若本逻辑段没存区中,但它们仍然是不同的段;若本逻辑段没有类别名,则将它与其它无类别名的逻辑有类别名,则将它与其它无类别名的逻辑 段放在一起。类别名必须放段放在一起。类别名必须放在单引号,典型的类别名为在单引号,典型的类别名为DATA,CODE和和STACK,也可也可由用户任意指定,但不能与程序中其它符号名或标号
24、相重。由用户任意指定,但不能与程序中其它符号名或标号相重。上一页返回下一页5.2 汇编语言的伪指令汇编语言的伪指令2段寄存器说明伪指令段寄存器说明伪指令 ASSUME 通常,通常,ASSUME伪指令位于代码段中,用来指示汇编程序,哪个伪指令位于代码段中,用来指示汇编程序,哪个段寄存器是其所对应段寄存器是其所对应 逻辑段的段地址寄存器。当在程序中使用了该语逻辑段的段地址寄存器。当在程序中使用了该语句后,汇编程序就能将所设定的段作为当句后,汇编程序就能将所设定的段作为当 前可访问的段来处理。使用前可访问的段来处理。使用ASSUME NOTHING则可取消前面由则可取消前面由ASSUME所指定的段寄
25、存所指定的段寄存 器。器。应注意,应注意,ASSUME只是指定了某个段寄存器,而并未将段地址装只是指定了某个段寄存器,而并未将段地址装入相应的段寄存器,入相应的段寄存器,段寄存器的内容还需由段寄存器的内容还需由MOV指令来完成;同样,指令来完成;同样,如果程序中有堆栈段,也需要把段地址装如果程序中有堆栈段,也需要把段地址装 入入SS中。然而,代码段则中。然而,代码段则不需要这样做,代码段的这一操作是在程序初始化时完成的。但不需要这样做,代码段的这一操作是在程序初始化时完成的。但 是,是,若在堆栈段定义时使用了组合类型若在堆栈段定义时使用了组合类型STACK,则连接时,系统会自动,则连接时,系统
26、会自动初始化初始化SS和和SP,因,因 而,源程序代码段中可省去而,源程序代码段中可省去ASSUME语句中的对语句中的对SS的说明部分。的说明部分。上一页返回下一页5.2 汇编语言的伪指令汇编语言的伪指令3组定义伪指令组定义伪指令 GROUP 伪指令伪指令 GROUP 用于将程序中若干个不同名的段集合成一组,使用于将程序中若干个不同名的段集合成一组,使它们都装在一个物理段它们都装在一个物理段 中,并赋予这个段集合一个组名。同一段组内中,并赋予这个段集合一个组名。同一段组内的段的数目不受限制,且同一段组内的各段的段的数目不受限制,且同一段组内的各段 的组合类型和类别可以不的组合类型和类别可以不同
27、,但段组的总字节数不能超过同,但段组的总字节数不能超过 64KB。这时,当程序在组内不同。这时,当程序在组内不同 类类型的段间运行时,可共用一个段寄存器,组内各段间的转移都可视为型的段间运行时,可共用一个段寄存器,组内各段间的转移都可视为段内转移。段内转移。指令格式:组名指令格式:组名 GROUP 段名,段名,段名,段名,上一页返回下一页5.2 汇编语言的伪指令汇编语言的伪指令4定位伪指令定位伪指令 ORG 定位伪指令定位伪指令 ORG 强行指定地址指针计数器的当前值,以改变数强行指定地址指针计数器的当前值,以改变数据或代码在段中的偏移地址。据或代码在段中的偏移地址。指令格式指令格式 1:OR
28、G表达式表达式 指令格式指令格式 2:ORG$+表达式表达式 功能:格式功能:格式 1 可直接将表达式的值(可直接将表达式的值(0 65535)置入地址计数器;)置入地址计数器;格式格式 2 将语句将语句 ORG前程序计数器的现行值前程序计数器的现行值$加上表达式的值后置入地加上表达式的值后置入地址计数器。址计数器。上一页返回下一页5.2 汇编语言的伪指令汇编语言的伪指令5.2.4 过程定义伪指令过程定义伪指令 过程也称子程序,在程序中任何地方都可以调用它。控制从主程过程也称子程序,在程序中任何地方都可以调用它。控制从主程序转移到过程被称为序转移到过程被称为“调用调用”。过程结束后返回主程序。
29、过程结束后返回主程序。使用过程可以简化源程序,并节省存储空间及程序设计所花的时使用过程可以简化源程序,并节省存储空间及程序设计所花的时间,使程序结构简洁清晰、减少编程工作量。间,使程序结构简洁清晰、减少编程工作量。过程定义伪指令格式:过程定义伪指令格式:上一页返回5.3 汇编语言程序设计基础汇编语言程序设计基础5.3.1 程序设计的一般步骤程序设计的一般步骤1分析问题并建立相应的建立数学模型分析问题并建立相应的建立数学模型 分析问题就是全面理解问题的意义和任务,把解决问题所需条分析问题就是全面理解问题的意义和任务,把解决问题所需条件、原始数据、输入和输出信息、运行速度要求、运算精度要求和结件、
30、原始数据、输入和输出信息、运行速度要求、运算精度要求和结果形式等搞清楚。果形式等搞清楚。建立数学模型是把问题数学化、公式化,这是把问题向计算机建立数学模型是把问题数学化、公式化,这是把问题向计算机处理方式转化的第一步处理方式转化的第一步 骤。解决同一个问题可以有不同的算法,但它骤。解决同一个问题可以有不同的算法,但它们的效率可能有很大的差别。有些问题比较们的效率可能有很大的差别。有些问题比较 直观,可不去讨论数学模直观,可不去讨论数学模型问题;有些问题符合某些公式或某些数学模型,可以直接利用;型问题;有些问题符合某些公式或某些数学模型,可以直接利用;但但有些问题没有对应的数学模型可以利用,需要
31、建立一些近似的数学模有些问题没有对应的数学模型可以利用,需要建立一些近似的数学模型去模拟问题。型去模拟问题。返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础2确定数学模型的算法确定数学模型的算法 在许多情况下,建立了数学模型后,并不能直接进行程序设计,在许多情况下,建立了数学模型后,并不能直接进行程序设计,还需要进一步确定符还需要进一步确定符 合计算机运算的算法。计算机的算法比较灵活,合计算机运算的算法。计算机的算法比较灵活,一般应优选一些逻辑简单、运算速度快、一般应优选一些逻辑简单、运算速度快、精度高的算法用于程序设计;精度高的算法用于程序设计;此外,还要考虑占用内存空间小、编程容
32、易等特点。算法可此外,还要考虑占用内存空间小、编程容易等特点。算法可 由计算机由计算机语言、日常生活语言、表格、自定义关系图或流程图等按计算机能够语言、日常生活语言、表格、自定义关系图或流程图等按计算机能够接受的方法接受的方法 进行描述。至于采用哪一种方式描述算法,有时还取决于进行描述。至于采用哪一种方式描述算法,有时还取决于习惯。本书将主要采用流程图来习惯。本书将主要采用流程图来 描述数学模型。描述数学模型。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础3编制程序编制程序 编制程序就是计算机语言的语法规定,书写计算机程序以解决编制程序就是计算机语言的语法规定,书写计算机程序
33、以解决问题的过程。采用汇编问题的过程。采用汇编 语言编写源程序时,应注意以下几个问题:语言编写源程序时,应注意以下几个问题:详细了解所用详细了解所用 CPU 的编程模型、指令系统、寻址方式和有关伪指令。的编程模型、指令系统、寻址方式和有关伪指令。汇编语言编程应按指令系统和伪指令的语法规则进行。汇编语言编程应按指令系统和伪指令的语法规则进行。须考虑存储空间分配问题,即在程序设计时要考虑分段结构。待执行须考虑存储空间分配问题,即在程序设计时要考虑分段结构。待执行的程序段的程序段 应设在当前段(活动段)中;程序在运行时所需要的工作单应设在当前段(活动段)中;程序在运行时所需要的工作单元应尽可能设在元
34、应尽可能设在 CPU 寄存器中,这样存取速度快,而且操作方便。寄存器中,这样存取速度快,而且操作方便。程序结构问题。程序的结构应具有层次简单、清晰、易读、易维护等程序结构问题。程序的结构应具有层次简单、清晰、易读、易维护等特点;程序结构可采用模块化、通用子程序或宏指令结构。若程序运特点;程序结构可采用模块化、通用子程序或宏指令结构。若程序运行时还伴随着人机对话过程,此时还应考虑用户在操作时的便捷性问行时还伴随着人机对话过程,此时还应考虑用户在操作时的便捷性问题,并应给用户一些提示性指导。题,并应给用户一些提示性指导。尽可能使用标号和变量来代替绝对地址和常数。尽可能使用标号和变量来代替绝对地址和
35、常数。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础4程序调试程序调试 程序调试是为了纠正程序中的错误,是程序设计的最后一步。程程序调试是为了纠正程序中的错误,是程序设计的最后一步。程序调试之前,应进行序调试之前,应进行 静态检查,以尽可能地减少程序调试时的麻烦。静态检查,以尽可能地减少程序调试时的麻烦。程序调试的方法很多,如在编辑、汇编、程序调试的方法很多,如在编辑、汇编、连接过程中,或在进行调试连接过程中,或在进行调试软件(如软件(如 DEBUG)调试时都可以发现错误并设法修改源程序。)调试时都可以发现错误并设法修改源程序。5编写说明文件编写说明文件 一个完整的软件必须有
36、相应的说明文件,这不仅方便用户使用,一个完整的软件必须有相应的说明文件,这不仅方便用户使用,也便于对程序的维护也便于对程序的维护 和扩充。说明文件主要包括程序的功能和使用方和扩充。说明文件主要包括程序的功能和使用方法、程序的基本结构和所采用的主要算法法、程序的基本结构和所采用的主要算法 以及程序的必要说明和注意以及程序的必要说明和注意事项等。事项等。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础5.3.2 程序设计的基本方法程序设计的基本方法1顺序结构程序顺序结构程序 这种程序的形式是程序的最基本形式,任何程序都离不开这种形这种程序的形式是程序的最基本形式,任何程序都离不开这
37、种形式。计算机执行该类式。计算机执行该类 程序的方式是完全按照指令在内存中的存放顺序,程序的方式是完全按照指令在内存中的存放顺序,逐条执行指令语句,即在程序执行过程逐条执行指令语句,即在程序执行过程 中不转移、不循环,直到程序中不转移、不循环,直到程序结束。结束。对熟悉指令的编程人员来说,一般不必严格按前面讲述的五个对熟悉指令的编程人员来说,一般不必严格按前面讲述的五个步骤设计这类简单程序,而可以直接对给出的题目写出源程序清单。步骤设计这类简单程序,而可以直接对给出的题目写出源程序清单。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础2分支结构程序分支结构程序 分支程序是利用条
38、件转移指令,使程序执行到某一指令后,根据分支程序是利用条件转移指令,使程序执行到某一指令后,根据条件是否满足,来决定程序的流向。这类程序使计算机有了判断功能。条件是否满足,来决定程序的流向。这类程序使计算机有了判断功能。常见的分支程序有以下三种形式,前两种也称为简单分支结构,常见的分支程序有以下三种形式,前两种也称为简单分支结构,后一种称为多分支结构。后一种称为多分支结构。IF-THEN 型:也称单纯分支结构。满足条件则转向执行程序段型:也称单纯分支结构。满足条件则转向执行程序段 1;否则,顺序执行。;否则,顺序执行。IF-THEN-ELSE 型:也称并行分支结构。满足条件则执行程序型:也称并
39、行分支结构。满足条件则执行程序段段 1;否则执行程序段;否则执行程序段 2。然后,再顺序执行后续的程序。然后,再顺序执行后续的程序。DO-CASE 型:也称选择分支结构。该结构可视为多个并行分支型:也称选择分支结构。该结构可视为多个并行分支的组合,依据程序的组合,依据程序 的转向开关的转向开关所设置的分支条件选择转向相应的所设置的分支条件选择转向相应的程序段。程序段。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础3循环结构程序循环结构程序(1)循环程序结构)循环程序结构 一般来讲,循环程序有两种基本结构:一般来讲,循环程序有两种基本结构:DO-WHILE 结构(循环结构(循环
40、次数已知)和次数已知)和 DO-UNTIL结构(循环次数未知)。结构(循环次数未知)。每种结构均包含有三个基本部分:循环程序初始化、循环体和循每种结构均包含有三个基本部分:循环程序初始化、循环体和循环控制。环控制。(2)循环控制方式)循环控制方式 常用的循环控制方式有以下常用的循环控制方式有以下 3 种:种:计数控制:事先已知循环次数,通过加计数控制:事先已知循环次数,通过加/减减 1 计数来控制循环。计数来控制循环。条件控制:事先不知循环次数,通过判定某种条件真假来控制循条件控制:事先不知循环次数,通过判定某种条件真假来控制循环。环。状态控制:通过实时测得的状态或事先设定的二进制位状态来控状
41、态控制:通过实时测得的状态或事先设定的二进制位状态来控制循环。制循环。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础5.3.3 子程序设计与调用技术子程序设计与调用技术1子程序设计与应用时应注意的问题子程序设计与应用时应注意的问题(1)子程序的调用与返回)子程序的调用与返回 子程序调用与返回通过子程序调用与返回通过 CALL 和和 RET 指令来实现的。子程序的指令来实现的。子程序的调用方式有近程调用、远程调用、直接调用和间接调用。调用方式有近程调用、远程调用、直接调用和间接调用。子程序调用实际是程序的转移,但它与转移指令有所不同:子程子程序调用实际是程序的转移,但它与转移指
42、令有所不同:子程序调用指令序调用指令 CALL 执执 行时要保护返回地址(每个子程序都必须用行时要保护返回地址(每个子程序都必须用 RET 返回指令将压入堆栈区的返回地址弹出送到返回指令将压入堆栈区的返回地址弹出送到 IP 或或 CS:IP 中),中),而转移指令则不考虑返回问题。而转移指令则不考虑返回问题。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础(2)现场的保护与恢复)现场的保护与恢复 若子程序中要用到主程序正在使用的某些寄存器或存储器单元,若子程序中要用到主程序正在使用的某些寄存器或存储器单元,而其中的内容在子程而其中的内容在子程 序运行后主程序还要继续使用,则必须
43、将它们压序运行后主程序还要继续使用,则必须将它们压入堆栈加以保护,在子程序结束后再将这入堆栈加以保护,在子程序结束后再将这 些内容恢复。这种操作通常些内容恢复。这种操作通常称为现场的保护与恢复。称为现场的保护与恢复。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础(3)主程序与子程序之间的参数传递)主程序与子程序之间的参数传递 参数可以是数据或地址,它是主程序与子程序之间的数据通道。参数可以是数据或地址,它是主程序与子程序之间的数据通道。通常,将子程序需要从主程序中获得的参数称为入口参数,而将子程通常,将子程序需要从主程序中获得的参数称为入口参数,而将子程序需要返回给主程序的参
44、数称为出口参数,序需要返回给主程序的参数称为出口参数,二者统称为接口参数。传二者统称为接口参数。传递参数需要主程序与子程序默契配合,否则,会产生错误结果或递参数需要主程序与子程序默契配合,否则,会产生错误结果或 造成造成死机。死机。参数传递的方式一般有以下三种方式:参数传递的方式一般有以下三种方式:寄存器传递寄存器传递 存储单元传递存储单元传递 堆栈传递堆栈传递上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础(4)子程序说明文件)子程序说明文件 由于子程序有共享性,可被其它程序调用。因此,常为每个子程由于子程序有共享性,可被其它程序调用。因此,常为每个子程序编写相应的说明文件。
45、序编写相应的说明文件。说明文件的内容大致如下:说明文件的内容大致如下:子程序名;子程序名;功能描述,包括功能、技术指标功能描述,包括功能、技术指标(如执行时间如执行时间)等;等;占用的寄存器和存储单元;占用的寄存器和存储单元;子程序的入口、出口参数及其传送方式;子程序的入口、出口参数及其传送方式;嵌套哪些子程序;嵌套哪些子程序;调用实例(可略)。调用实例(可略)。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础2子程序调用技巧子程序调用技巧子程序调用比较灵活,常用的调用技巧有:子程序调用比较灵活,常用的调用技巧有:子程序嵌套:子程序调用其它子程序的过程称为子程序嵌套,嵌套的子程
46、序嵌套:子程序调用其它子程序的过程称为子程序嵌套,嵌套的层次不限;层次不限;子程序递归:子程序调用子程序自身的过程称为子程序递归;子程序递归:子程序调用子程序自身的过程称为子程序递归;可重入子程序:子程序被调用后没有执行完,而又被另一个程序重复可重入子程序:子程序被调用后没有执行完,而又被另一个程序重复调用称为可重入。这种形式一般用在多用户系统;调用称为可重入。这种形式一般用在多用户系统;协同子程序:两个以上的子程序协同完成一项任务,且又相互调用,协同子程序:两个以上的子程序协同完成一项任务,且又相互调用,直到任务结直到任务结 束。束。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设
47、计基础5.3.4 DOS 功能子程序的调用功能子程序的调用1概述概述 在汇编语言设计中,可以用在汇编语言设计中,可以用 ROM-BIOS 的一些软中断和的一些软中断和 DOS 系统功能调用来扩充汇编系统功能调用来扩充汇编 语言的功能。语言的功能。BIOS 和和 DOS 是两组服务软是两组服务软件,可为用户提供各种与设备有关的例行子程序。件,可为用户提供各种与设备有关的例行子程序。用户只需按照一定用户只需按照一定的要求填写参数,即可调用这些子程序对计算机硬件的要求填写参数,即可调用这些子程序对计算机硬件 I/O 进行操作,进行操作,而不而不 必过多地涉及硬件组成逻辑。必过多地涉及硬件组成逻辑。针
48、对同一种操作,有时,针对同一种操作,有时,DOS 和和 BIOS 都提供有类似的服务功能。都提供有类似的服务功能。BIOS 是软件系统中是软件系统中 最低一级的软件,它与硬件组成密切相关,是计最低一级的软件,它与硬件组成密切相关,是计算机硬件与其它程序之间的一个简单的算机硬件与其它程序之间的一个简单的“接接 口口”。由于。由于 BIOS 紧密依紧密依赖于硬件系统,致使利用赖于硬件系统,致使利用 BIOS 功能调用所编写的程序,在硬件系功能调用所编写的程序,在硬件系 统统稍有差别的计算机上运行时,有时会出现不兼容现象,导致软件兼容稍有差别的计算机上运行时,有时会出现不兼容现象,导致软件兼容性变差
49、;同时,性变差;同时,BIOS 调用时,必须准确说明读写位置(磁道和扇区调用时,必须准确说明读写位置(磁道和扇区号),才能正确读写信息。号),才能正确读写信息。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础 DOS 则在更高层次上为用户提供服务功能。在则在更高层次上为用户提供服务功能。在 DOS 调用时,仅调用时,仅需引用文件名、目录即需引用文件名、目录即 可,不必指出读写信息在磁盘上的物理位置。可,不必指出读写信息在磁盘上的物理位置。通常,使用通常,使用 DOS 调用比使用调用比使用 BIOS 调用更加调用更加 容易。因此,在可能时,容易。因此,在可能时,应尽量使用应尽量使
50、用 DSO 调用而不使用调用而不使用 BIOS 调用,以使程序既易于编写、调用,以使程序既易于编写、又便于调试。又便于调试。DOS 和和 BIOS 功能调用都可采用软中断指令功能调用都可采用软中断指令 INT n 来实现。其中,来实现。其中,n 为中断调用类型号,为中断调用类型号,其值为其值为 00FFH。一般情况下,中断号。一般情况下,中断号 n 小小于于 20H 的调用是的调用是 BIOS 调用,调用,21H 以上是以上是 DOS 调用。调用。上一页返回下一页5.3 汇编语言程序设计基础汇编语言程序设计基础2基本基本 DOS 功能子程序功能子程序 键盘是键盘是 PC 机的主要输入设备之一。