1 / 98

第四章 汇编语言程序设计

第四章 汇编语言程序设计. www.qust.edu.cn. § 4.1 汇编语言语句. § 4.2 伪指令. § 4.3 汇编语言程序的结构. § 4.4 汇编语言程序的开发过程. § 4.5 汇编语言程序结构设计. § 4.6 系统功能调用. § 4.7 汇编语言设计实例. 第四章 汇编语言程序设计. 在了解和熟悉了 86 系列指令系统的基础上,本章将介绍宏汇编语言程序的结构,伪指令,以及程序设计的一般过程和各种基本程序结构,然后介绍了系统功能调用,最后给出大量的编程实例。. § 4.1 汇编语言语句. 一、汇编语言语句种类及其格式.

signa
Download Presentation

第四章 汇编语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 汇编语言程序设计 www.qust.edu.cn

  2. §4.1 汇编语言语句 §4.2 伪指令 §4.3 汇编语言程序的结构 §4.4 汇编语言程序的开发过程 §4.5 汇编语言程序结构设计 §4.6 系统功能调用 §4.7 汇编语言设计实例 第四章 汇编语言程序设计 在了解和熟悉了86系列指令系统的基础上,本章将介绍宏汇编语言程序的结构,伪指令,以及程序设计的一般过程和各种基本程序结构,然后介绍了系统功能调用,最后给出大量的编程实例。 www.qust.edu.cn

  3. §4.1 汇编语言语句 一、汇编语言语句种类及其格式 语句是汇编语言源程序的基本组成单位。一个汇编语言源程序中有3种基本语句:指令语句、伪指令语句和宏指令语句。前两种是最常见、最基本的语句。指令语句和伪指令语句不仅在程序中的功能不同,而且实现其功能的方法和时间也是不同的。 1、指令语句 指令语句就是计算机中指令系统的各条指令,每条指令语句在汇编时都产生一个供CPU执行的机器目标代码。 计算机中每条指令语句表示一种基本功能,这些基本功能是在程序运行期间由计算机硬件来实现的。一条指令语句由四个字段组成,其一般格式如下: [标号:] 指令助记符 [操作数] [;注释] www.qust.edu.cn

  4. §4.1 汇编语言语句 一、汇编语言语句种类及其格式 2、伪指令语句 伪指令语句指示汇编程序在汇编源程序时完成某些工作,比如完成数据定义、分配存储区、指示程序结束等。 伪指令属于汇编控制命令,它所指示的操作是由汇编程序在汇编源程序时完成的,在汇编时,它不产生目标代码,在将源程序汇编成目标程序后,它就不复存在了。 由上可知,伪指令语句与指令语句的主要区别是:伪指令语句经汇编后不产生机器目标代码,而指令语句经汇编后将产生相应的机器目标代码;伪指令语句所指示的操作是在程序汇编时完成的,而指令语句的操作必须在程序运行时才能完成。一条伪指令语句也由四个字段组成,其一般格式如下: [符号名] 伪指令符 操作数 [;注释] www.qust.edu.cn

  5. §4.1 汇编语言语句 一、汇编语言语句种类及其格式 (1)符号名 符号名在伪指令语句中是一个可选项,符号名后面没有冒号,符号名可以是常量名、变量名、过程名等。 (2)伪指令符  伪指令符指定汇编程序要完成的具体操作,它是伪指令语句的核心部分,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,定义过程伪指令PROC等等。 (3)操作数 伪指令中的操作数可以是常数、字符串、变量、表达式,其个数由具体的伪指令决定,各个操作数之间用“,”分隔。 (4)注释 伪指令语句的注释也是可选项,需要时必须以“;”开始。 www.qust.edu.cn

  6. §4.1 汇编语言语句 一、汇编语言语句种类及其格式 3、标识符 指令语句中的标号和伪指令语句中的符号名统称为标识符。它们由若干字符组成,标识符的组成规则如下: (1)一个标识符由1--3个字符组成。 (2)组成标识符的字符可以是字母(A--Z或a--z)、数字(0--9)、专用字符(“?”、“·”、“@”、“$”、“下划线_”)。 (3)除数字外,上述其余字符均可作为标识符的首字符,“·”只能作为标识符的首字符。 (4)不能使用属于系统的专用保留字。 www.qust.edu.cn

  7. 源程序的每条语句可表示为: [名字]操作码 操作数[; 注释] 标号 指令 寄存器 说明程序或语句 变量 伪指令 标号 的功能 宏指令 变量 常数 表达式 §4.1 汇编语言语句 二、汇编语言数据与运算符 www.qust.edu.cn

  8. §4.1 汇编语言语句 二、汇编语言数据与运算符 1、常量 常量是没有任何属性的纯数值,它的值在汇编期间已能完全确定,且在程序运行中也不会发生变化。常量分为数值常量、字符串常量和符号常量,它主要用于指令语句中的立即数或伪指令语句中给变量赋初值等。 1)数值常量  数值常量分为整数和实数。  例如:11100011B ,45693 ,0FF2AH ,356703Q都是正确的整数形式,      又如:543.567,﹣45.23,1.2E﹣2,﹣45.4E﹢9都是正确的实数形式。 2)字符串常量  字符串常量是用单引号括起来的一个字符或多个字符。字符串常量以单引号中各字符的ASCII码形式存储在内存中,如‘H’,在内存中就是41H,‘12’就是31H,32H。使用时可在单引号内直接写字符序列,如‘12AB’,也可写字符的ASCII码,ASCII码之间用逗号分隔(此时不需要用单引号),如31H,32H,41H,42H表示字符串‘12AB’。 3)符号常量  符号常量是指用EQU伪指令或赋值语句“=”定义过的符号名,可作操作数项或在表达式中使用。 www.qust.edu.cn

  9. §4.1 汇编语言语句 二、汇编语言数据与运算符 2、变量   在汇编语言中,变量是一个数据存储单元的名称,即数据存放地址的符号表示。它代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以改变。为方便访问变量,在程序中通过变量名来使用变量。 (1)变量的定义 变量通常在数据段或附加段中使用数据定义伪指令来定义,定义变量就是给数据分配存储单元,有时为存储单元赋予一个变量名,并可同时为这些存储单元预置初值。数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT) 表达式1,表达式2,… www.qust.edu.cn

  10. §4.1 汇编语言语句 二、汇编语言数据与运算符 其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址;DB、DW、DD、DQ和DT是伪指令符,具体一条数据定义伪指令取5种之一。 表达式1,表达式2……是给变量或指定的存储单元赋予初值,它们有以下几种形式: (a)数值表达式 (b)字符串表达式 (c)?表达式 (d)地址表达式(只适用于DW和DD这两种数据定义伪指令) (e)带DUP的表达式 (2)变量的属性 由于存储器是分段使用的,因而源程序定义的变量具有3个属性: (a)段属性(SEG) (b)偏移属性(OFFSET) (c)类型属性(TYPE) www.qust.edu.cn

  11. §4.1 汇编语言语句 二、汇编语言数据与运算符 (3)变量的使用 定义后的变量,在程序中的引用有两种情况: (a)在指令语句中,采用存储器操作数的几种寻址方式,除寄存器间接寻址方式不使用变量名外,其余各种寻址方式均可使用变量名。 例如,某数据段已定义一变量ARRAY: ARRAY DW 5000H,4000H (b)在数据定义伪指令DW和DD中,操作数字段可直接引用已定义过的变量名。 如: A DB 50H,40H B DW A C DD B www.qust.edu.cn

  12. §4.1 汇编语言语句 二、汇编语言数据与运算符 3、标号 标号是一条指令语句的符号地址,在汇编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在控制转移指令中直接引用这个标号。标号一般在代码段中定义和引用。由于标号代表了指令的符号地址,所以标号也有3个属性: (a)段属性(SEG)。标号的段属性是指标号定义所在段的段首地址。 (b)偏移属性(OFFSET)。标号的偏移属性是指标号所在段的段首地址到该标号的字节距离。 (c)类型属性(TYPE)。标号的类型属性表示了它的转移特性,即该标号是作为段内还是段间转移(或调用)指令的目标地址。标号的类型属性有2种:NEAR类型和FAR类型。 www.qust.edu.cn

  13. §4.1 汇编语言语句 二、汇编语言数据与运算符 4、表达式和运算符  汇编语言的指令语句和伪指令语句中,表达式是操作数项的常见形式,表达式是由常量、变量、标号用运算符连接而成有意义的式子。表达式分为数值表达式和地址表达式,任一表达式的值只计算一次,表达式的计算是在源程序汇编过程中进行的,而不是在程序运行中进行的,汇编程序将表达式计算后得到一个数值或一个地址。 在8086汇编语言中,运算符分为:算术运算符、逻辑运算符、关系运算符、数值回送运算符、属性运算符和字节分离运算符。 www.qust.edu.cn

  14. §4.1 汇编语言语句 二、汇编语言数据与运算符 (1)数值表达式 数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它只有大小而没有属性。 (2)地址表达式 地址表达式是由常量、变量、标号、寄存器(BX、BP、SI、DI)内容(用寄存器名加方括号表示)和运算符组成的有意义的式子。单个的变量、标号、寄存器的内容是地址表达式的特例。 地址表达式中可以使用算术运算符中的“+”、“-”运算符、关系运算符、属性运算符、数值返回运算符和分离运算符。 在地址表达式中,常用的形式是:变量±常量。 www.qust.edu.cn

  15. §4.1 汇编语言语句 二、汇编语言数据与运算符 (3)表达式运算符 (a)算术运算符:+,-,*,/,MOD,SHL,SHR。 (b)逻辑运算符:AND,OR,XOR,NOT。 (c)关系运算符:EQ,NE,LT,LE,GT,GE。当关系成立时,结果为0FFFFH,当关系不成立时,结果为0。 (d)数值回送运算符:SEG,OFFSET,TYPE,SIZE,LENGTH。 OFFSET /SEG 变量 / 标号 功能:回送变量或标号的偏址 / 段址 TYPE 变量/ 标号/ 常数 DB DW DD DF DQ DT NEAR FAR 常数 1 2 4 6 8 10 -1 -2 0 LENGTH 变量 功能:回送由DUP定义的变量的单元数,其它情况回送1 SIZE 变量 功能:LENGTH * TYPE www.qust.edu.cn

  16. §4.1 汇编语言语句 二、汇编语言数据与运算符 (5)属性运算符:PTR,段操作符,THIS,SHORT 。 类型 PTR 表达式MOV WORD PTR [BX], 5 段操作符MOV ES: [BX], AL SHORT 标号JMP SHORT NEXT THIS 类型TA EQU THIS BYTE TD DW 1234H NEXT EQU THIS FAR MOV AX,2 (6)分离运算符:LOW,HIGH。 HIGH和LOWCONS EQU 1234H MOV AH, HIGH CONS MOV AL, LOW CONS www.qust.edu.cn

  17. §4.2 伪指令 • 1 数据定义伪指令 • 2 符号定义伪指令 • 3 段定义伪指令SEGMENT/ENDS • 4 假定伪指令ASSUME • 5定位伪指令ORG与地址计数器($) • 6 过程定义伪指令PROC/ENDP • 7 源程序开始和结束伪指令 www.qust.edu.cn

  18. DATA_BYTE  - FFH FBH 00H 64H 01H 10H 04H 0AH - 00H - DATA_WORD  §4.2 伪指令 1 数据定义伪指令 • 常用的数据定义伪指令有DB,DW,DD,DQ,DT。 • 格式:[变量名] 数据定义伪指令 表达式 [,…] • 功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。 例: DATA_BYTE DB 10,4,10H,? DATA_WORD DW 100,100H,-5,? www.qust.edu.cn

  19. ARRAY  48H 45H 4CH 4CH 4FH 41H 42H 42H 41H §4.2 伪指令 1 数据定义伪指令 例: ARRAY DB ‘HELLO’ DB ‘AB’ DW ‘AB’ 例: PAR1 DW 100,200 PAR2 DW 300,400 ADDR_TABLE DW PAR1,PAR2 VAR DB 100 DUP (?) DB 2 DUP (0,2 DUP(1,2),3) www.qust.edu.cn

  20. §4.2 伪指令 1 数据定义伪指令 • OPER1 DB ?, ? • OPER2 DW ?, ? • …… • MOV OPER1, 0 ;字节指令 • MOV OPER2, 0 ;字指令 • OPER1 DB 1, 2 • OPER2 DW 1234H, 5678H • …… • MOV AX, OPER1+1 × • MOV AL, OPER2 × 类型不匹配 • MOV AX, WORD PTR OPER1+1 • MOV AL, BYTE PTR OPER2 (AX)=3402H (AL)=34H www.qust.edu.cn

  21. §4.2 伪指令 2 符号定义伪指令 1) 等价伪指令EQU 2) 等号伪指令= 3) 定义符号名伪指令LABEL www.qust.edu.cn

  22. §4.2 伪指令 2 符号定义伪指令-等价伪指令EQU 1) 等价伪指令EQU • 格式:符号名 EQU 表达式 • 功能:为常量、表达式及其他各种符号定义一个等价的符号名,但它不申请存储单元。 • 用途:① 用符号表示常量、数值表达式,即定义符号常量。使用符号常量可使程序简单明了,增强程序的可读性和通用性。 ② EQU与属性运算符PTR或THIS联合使用,可以给变量或标号定义新的类型属性并重新命名,但保持其段偏移地址属性不变。 ③ 利用EQU可以用一个符号名替代一个复杂的地址表达式和其他一些符号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。 • 例如:ALPHA EQU 9 • BETA EQU ALPHA+18 • BB EQU [BP+8] www.qust.edu.cn

  23. §4.2 伪指令 2 符号定义伪指令- 等号伪指令= • 格式:符号名 = 表达式 • 功能:为常量、表达式及其他各种符号定义一个等价的符号名,并能对所定义的符号多次重复定义,且以最后一次定义的值为准。 【例】定义等价符号名。 ┆ COST = 20 M = MOV LOST = LOST+10 ;30→LOST M = ADD ;M=ADD ┆ www.qust.edu.cn

  24. §4.2 伪指令 2 符号定义伪指令-定义符号名伪指令LABEL • 格式:变量名或标号  LABEL  类型 • 功能:定义与原有变量类型不同的新变量或为指令语句定义有指定类型的标号。通常与数据定义伪指令连用,其功能类似语句“变量名或标号 EQU THIS 类型”。 【例】定义新类型的变量。 ┆ DDBUF LABEL DWORD BUF DB 200 DUP(0) ┆  A LABEL FAR B: LEA DX,BUF ┆ www.qust.edu.cn

  25. §4.2 伪指令 3 段定义伪指令SEGMENT/END 编制一个80X86汇编语言源程序,段是基础,这有两方面含义:一是必须按段来构造程序,二是在程序执行时,要凭借四个段寄存器对各个段的存储单元进行访问。 格式:段名 SEGMENT [定位类型] [组合类型] [‘类别’] ┇ 段体 段名 ENDS 功能:定义一个逻辑段,指定段的名字和范围,段在内存    中的起始位置、段与段之间的连接关系。 说明:① 段名由用户指定,开始与结束的段名须一致。    ② SEGMENT/ ENDS伪指令把程序分成若干逻辑段。    ③ 删节号为段体,段体内为指令和伪指令序列。 ④段的长度不超过64KB。SEGMENT后面的参数是可选 项。 www.qust.edu.cn

  26. §4.2 伪指令 4 假定伪指令ASSUME 假定伪指令主要用于指示汇编程序哪些段是当前段以及这些段 与段寄存器之间的对应关系。 • 格式:ASSUME 段寄存器:段名 [,段寄存器:段名] • 功能:该伪指令告诉汇编程序在汇编时,段寄存器CS、DS、SS和ES应具有的符号段基址,以便汇编指令时确定段和建立错误信息。但是段寄存器实际值(CS除外)还要由传送指令在执行程序时赋值。该伪指令一般出现在代码段中。 【例】用ASSUME伪指令建立代码段、堆栈段与CS和SS的对应关系。 DATA1 SEGMENT A DB 1,2,3 DATA1 ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA2 SGEMENT B DB ‘123ABC DATA2 ENDS www.qust.edu.cn

  27. §4.2 伪指令 4 假定伪指令ASSUME DATA3 SEGMENT C DB ?,?,? DATA3 ENDS CODE SEGMENT ASSUME DS:DATA1,ES:DATA2,CS:CODE,SS:STACK START: MOV AX,DATA1 MOV DS,AX ;DATA1→DS MOV AX,DATA3 MOV ES,AX ;DATA3→ES ┆ Q1: MOV AL,A Q2: MOV C,AL ASSUME DS:DATA2 ;建立DS与 B段的对应关系 MOV AX,DATA2 MOV DS,AX MOV AL,B MOV C,AL ┆ CODE ENDS END START www.qust.edu.cn

  28. §4.2 伪指令 5 定位伪指令ORG与地址计数器($) • 汇编程序在汇编源程序时,每遇到一新段,就为该段设置一个初值为0的汇编地址计数器,汇编程序使用汇编地址计数器保存正在汇编的数据或指令的目标代码在当前段内的偏移地址。 • 当前地址计数器的值可用符号$表示,用户可在程序中直接使用$,表示引用当前汇编地址计数器的值。例如: ARRAY DW 4000H,5000H,6000H COUNT EQU ($ - ARRAY)/ 2 汇编地址计数器的值可以用定位伪指令ORG设置。 www.qust.edu.cn

  29. §4.2 伪指令 5 定位伪指令ORG与地址计数器($) • 格式:ORG 数值表达式 • 功能:将数值表达式的值赋给汇编地址计数器。数值表达式的值须为0-65535之间的非负整数。 该伪指令把以下语句定义的内存数据或程序,从表达式指定的起点(偏移地址)开始连续存放,直至遇到新的ORG指令。 【例】给汇编地址计数器赋值。 DATA SEGMENT ORG 10 ; 置$值为10 VAR1 DW 100H,200H ORG $+5 ; 置$的值为14+5,即为19 VAR2 DB 1,2, $+1,$+2 N EQU $-VAR2 ; ($)=23 DATA ENDS www.qust.edu.cn

  30. §4.2 伪指令 6 过程定义伪指令PROC/ENDP 在程序设计中,常把具有某种功能的程序段设计成一个过程。80X86宏汇编语言用于过程定义的伪指令的格式为: 过程名 PROC [ NEAR 或FAR ] ┆ ;过程体 过程名 ENDP 其中过程名是过程入口地址的符号表示,它由程序员指定,且开始处和结束处的过程名一致。过程名同标号一样,具有三种属性:段属性、偏移属性和类型属性,类型属性可指定为NEAR或FAR两种。默认时系统约定是NEAR。过程体为过程内的指令和伪指令序列。 定义过程是为实现子程序调用而设的,调用格式为: CALL〈过程名〉 过程由RET指令返回。 www.qust.edu.cn

  31. §4.2 伪指令 7 源程序开始和结束伪指令 (1)源程序开始伪指令 在源程序开始处可以用NAME或TITLE为模块取名字。 ① NAME伪指令 格式:NAME 模块名 汇编程序将以给出的“模块名”作为模块的名字。 ② TITLE伪指令 如果程序中没有NAME伪指令,则也可使用TITLE伪指令。 格式:TITLE text TITLE伪指令可指定每一页上打印的标题。同时,若程序中没有NAME伪指令,则汇编程序将用text 中的前6个字符作为模块名。text最多可有60个字符。 若程序中既无NAME又无TITLE伪指令,则将用源程序名作为模块名。所以NAME及TITLE伪指令并不是必要的,但一般常使用TITLE,以便在列表文件中能打印出标题来。 www.qust.edu.cn

  32. §4.2 伪指令 7 源程序开始和结束伪指令 (2)源程序结束伪指令 格式:END [ 地址表达式 ] 功能:该语句为源程序的最后一个语句,用以标志整    个程序的结束,即告诉汇编程序汇编工作到此    结束。   其中,地址表达式为可选项,若选用地址表达式,则表示此程序是主程序,它可以单独执行,其地址表达式为该程序的启动地址,即程序开始运行的第一条指令的地址,例如,“END START”,此START是第一条指令的标号;若不选用表达式,则说明此程序为一子程序,不能单独运行,只能被其它程序调用。 www.qust.edu.cn

  33. §4.3 汇编语言程序的结构 一个汇编源程序是分段的,由若干个段形成一个源程序。其中,必不可少的是代码段和堆栈段,堆栈段也可以不用显示定义,可以直接使用隐式堆栈段,如果程序中需要使用数据存储区,还要定义数据段,必要时还要定义附加段。 一般情况下,对于不太复杂的程序只需要三个段(即数据段、堆栈段和代码段)就可以了,而对于复杂的程序,除了使用上述三个段以外还可以使用多个段,甚至可以使用多个程序模块。 汇编语言源程序结构通常有两种,它们的区别在于代码段中某些部分的编写稍有不同。具体地说,就是用户程序运行结束后,返回DOS的方法上有所不同。 www.qust.edu.cn

  34. 完整的段定义格式 data segment ; 定义数据段 … data ends ;---------------------------------------- extra segment ; 定义附加段 … extra ends ;---------------------------------------- code segment ; 定义代码段 assume cs:code, ds:data, es:extra start: mov ax, data mov ds, ax ; 段地址  段寄存器 … code ends end start DS ES  文件头 PSP SS CS 装入模块 EXE程序的内存映象图 §4.3 汇编语言程序的结构 www.qust.edu.cn

  35. §4.3 汇编语言程序的结构 1、用INT 21H返回DOS的程序结构模式   INT 21H是DOS系统功能调用,用这种方法返回DOS的程序结构比较简单,我们编写程序常采用此结构,具体编写时只要在用户程序的最后安排两条指令即可,即: MOV AH,4CH    INT 21H 2、用过程返回DOS的程序结构模式   采用此种方法返回DOS的程序结构,要求将用户程序定义为一个类型为FAR的过程,在用户程序的开始处要将DS的值压栈,偏移地址0压栈,在程序的最后安排一条RET指令。这样当程序运行到RET指令后便可返回DOS。 www.qust.edu.cn

  36. …… code segment main proc far assume …… start: push ds mov ax, 0 push ax …… ret main endp code ends end start …… code segment main proc far assume …… start: …… …… mov ax,4c00h int 21h main endp code ends end start §4.3 汇编语言程序的结构 www.qust.edu.cn

  37. 编辑程序 myfile.asm 汇编程序 myfile.lst myfile.crf otherfiles.obj myfile.obj 链接程序 myfile.map myfile.exe §4.4 汇编语言程序的开发过程 1. 源程序的编辑 2. 源程序的汇编 3. 目标文件的链接 www.qust.edu.cn

  38. §4.5 汇编语言程序结构设计 在汇编语言程序设计中,程序有顺序、分支、循环和子程序四种基本结构形式。 4.5.1 顺序程序设计 4.5.2 分支程序设计 4.5.3 循环程序设计 4.5.4 子程序的设计 4.5.5 宏指令 www.qust.edu.cn

  39. §4.5 汇编语言程序结构设计 • 汇编语言程序设计步骤: (1)分析问题:已知条件、要解决的问题、功能/性能要求等。 (2)建立数学模型:把问题数学化、公式化,便于计算机处理。 (3)确定算法:简单、速度快、精度高、代码量小、编程容易。 (4)绘制程序流程图:用箭头、框图、菱形图等表示程序结构。 (5)内存空间分配:为程序或数据分配内存空间。 (6)编制程序与静态检查:程序结构层次简单、清楚、易懂。 (7)程序调试:利用调试软件DEBUG进行调试。 • 汇编语言程序设计的特点: • (1)算法要分解至指令级;高级语言为语句级。 • (2)要详细考虑内存空间分配问题:任何一个变量、一条指令都要明确其存储位置。 www.qust.edu.cn

  40. §4.5.1 顺序程序设计 顺序程序设计也称为简单程序设计,这种结构的程序不使用分支、循环结构,程序本身的逻辑非常简单,所以只能完成一些简单操作。其特点是程序顺序执行,由前向后逐条执行指令。 【例】试编写一程序计算下列表达式的值。 w=(v-(x*y+z-540))/x 式中x、y、z、v均为有符号字数据。 设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图所示。 www.qust.edu.cn

  41. §4.5.1 顺序程序设计 源程序如下: DATA SEGMENT X DW 200 Y DW 100 Z DW 3000 V DW 10000 W DW 2 DUP(?) DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK 顺序运算程序流程图 www.qust.edu.cn

  42. §4.5.1 顺序程序设计 START: MOV AX,DATA MOV DS,AX ;DATA→AX MOV AX,X IMUL Y;(X)*(Y)→DX:AX MOV CX,AX MOV BX,DX ;(DX:AX)→ (BX:CX) MOV AX,Z CWD ;(Z)符号扩展 ADD CX,AX ADC BX,DX ;(BX:CX)+ (DX:AX)→(BX:CX) SUB CX,540 SBB BX,0 ;(BX:CX)-540→ (BX:CX) MOV AX,V CWD ;(V)符号扩展 SUB AX,CX SBB DX,BX ;(DX:AX)- (BX:CX)→(DX:AX) IDIV X ;(DX:AX)/X MOV W,AX ;商→W MOV W+2,DX ;余数DX→W+2 MOV AH,4CH INT 21H CODE ENDS END START www.qust.edu.cn

  43. N 条件1? 条件? Y N 条件2? … Y case 1 case 2 case n case 1 case 2 case n CASE 结构 IF-THEN-ELSE 结构 §4.5.2 分支程序设计 分支程序是利用条件转移指令实现程序执行次序改变的一种程序结构形式,即当程序执行到某一指令后,根据某个条件是否满足,分别执行不同的指令序列。 一般来说,分支程序经常是先用比较指令或数据操作及位检测指令等来改变标志寄存器各个标志位。然后用条件转移指令进行分支。 分支程序结构可以有两种形式,如下图所示,它们分别相当于高级语言中的IF-THEN-ELSE语句和CASE语句。 www.qust.edu.cn

  44. 1 X>0 Y= 0 X=0 -1 X<0 §4.5.2 分支程序设计 【例】编写计算右面函数值的程序: 设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如下图所示。 www.qust.edu.cn

  45. §4.5.2 分支程序设计 程序如下: data segment x db -10 y db ? data ends stack segment stack db 200 dup(0) stack ends code segment assume ds:data,ss:stack, cs:code start: mov ax, data mov ds, ax cmp x, 0 ;与0进行比较 jge a1 ;x≥0转a1 mov y, -1 ;x <0时,-1→y jmp exit a1: jg a2 ;x>0转a2 mov y, 0 ;x=0时,0→y jmp exit a2: mov y, 1 ;x>0,1→y exit: mov ah, 4ch int 21h code ends end start www.qust.edu.cn

  46. §4.5.2 分支程序设计 用跳转表实现多路分支 在实现CASE结构时,可以使用跳转表法使程序能根据不同 的条件转移到多个程序分支中去。 • 需要在数据段事先安排一个按顺序排列的转移地址表。 • 输入数字作为偏移量。 • 关键是要理解间接寻址方式JMP指令。 【例5.5】设某程序有8路分支,试根据给定的N值(1-8),将程序的执行转移到其中的一路分支。 程序流程如图所示。 www.qust.edu.cn

  47. §4.5.2 分支程序设计 START: MOV AX,DATA MOV DS,AX ┆ MOV AL,N DEC AL ADD AL,AL MOV BL,AL MOV BH,0 JMP TAB[BX] P1: …… ┆ JMP EXIT P2: …… ┆ JMP EXIT P2: …… ┆ JMP EXIT 程序如下: DATA SEGMENT TAB DW P1,P2,P3,P4, P5,P6,P7,P8 N DB 5 DATA ENDS STACK SEGMENT DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK, CS:CODE www.qust.edu.cn

  48. §4.5.2 分支程序设计 P3: …… ┆ JMP EXIT ┆ P8: …… ┆ EXIT: MOV AH,4CH INT 21H CODE ENDS END START 上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址。 www.qust.edu.cn

  49. 初始化 初始化 N 循环控制 循环体 Y N 循环控制 循环体 Y 结束处理 结束处理 DO-UNTIL 结构 DO-WHILE 结构 §4.5.3 循环程序设计 • 循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体。 • 循环结构程序缩短了程序的长度、减少了占用的内存空间;但它并不简化程序执行过程,相反,由于增加了一些循环控制等环节,总的程序执行语句和时间会有所增加。 • 循环程序一般由4部分组成:初始化、循环体、循环控制和循环结束处理。 • 循环程序有两种结构形式:DO-WHILE 结构和DO-UNTIL 结构 www.qust.edu.cn

  50. §4.5.3 循环程序设计 • 循环程序各部分的内容: (1)初始化:建立循环次数计数器,设定变量和存放数据的内存地址指针(常用间址方式)的初值等。 (2) 循环体:实现程序功能的、被重复执行的指令序列。 (3) 循环控制:修改变量和地址指针,为下一次循环做准备;修改循环计数器或者判断循环条件是否满足,满足则继续循环,否则结束循环。 (4) 结束处理:它主要用来分析和存放程序的结果。 • 循环控制方式有多种,如计数控制、条件控制等。 • 不管哪一种控制循环方式,最终都是要达到控制循环的目的。若考虑不周,会造成死循环,对这一点要注意。 • 循环可以用跳转语句实现,如JMP,JZ等;也可以用专用循环控制语句实现,如LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ。 www.qust.edu.cn

More Related