《汇编语言(微机)第三章下.ppt》由会员分享,可在线阅读,更多相关《汇编语言(微机)第三章下.ppt(123页珍藏版)》请在金锄头文库上搜索。
1、主讲教师:范新民主讲教师:范新民第三章:第三章:第三章:第三章:80868086汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计1 3.2.1 汇编语言源程序的格式汇编语言源程序的格式1 3.2.2 常量、标识符和表达式常量、标识符和表达式23.2.3 指示性语句指示性语句380868086汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计3.2.4 指令性语句指令性语句43.2.5 宏指令宏指令5280868086汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计3.2.1 汇编语言源程序的格式汇编语言源程序的格式一、基本概念一、基本概念1、机器语
2、言、汇编语言和高级语言、机器语言、汇编语言和高级语言机器语言:用机器语言:用0、1代码表示的机器指令形式,是机器硬件代码表示的机器指令形式,是机器硬件 唯一能识别和执行的语言。唯一能识别和执行的语言。 例:机器指令例:机器指令0100 0000;表示(表示(AX)1AX汇编语言汇编语言 :用符号表示指令的操作码、操作数。又称符号:用符号表示指令的操作码、操作数。又称符号 语言。语言。 例:例:INC AX ;增;增1指令指令3汇编语言和机器语言都是面向机器的语言,即不同汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。的机器有不同的指令系统。机器指令与机器代码是一一对应的。机
3、器指令与机器代码是一一对应的。汇编语言机器语言均属于低级语言汇编语言机器语言均属于低级语言。高级语言:高级语言: 接近人的自然语言和数学表达式。用高级语言编写接近人的自然语言和数学表达式。用高级语言编写的程序是脱离机器的、面向过程或面向对象的语言。如:的程序是脱离机器的、面向过程或面向对象的语言。如:C语言,语言,Java语言等。语言等。汇编语言源程序的格式汇编语言源程序的格式42、汇编语言的特点、汇编语言的特点代码长度短,执行速度最快代码长度短,执行速度最快可直接有效的控制机器的运行可直接有效的控制机器的运行准确掌握机器运行时间准确掌握机器运行时间可最有效的利用可最有效的利用CPU、内存、内
4、存、I/O资源资源 直接控制机器运行的场合直接控制机器运行的场合 汇编语言常用于:汇编语言常用于: 需要准确控制运行时间的场合需要准确控制运行时间的场合 运行速度要求很高的场合运行速度要求很高的场合汇编语言源程序的格式汇编语言源程序的格式5汇编语言源程序的格式汇编语言源程序的格式3、语句的类别与结构语句的类别与结构分段结构:分段结构:最多可由最多可由4种段组成:代码段、数据段、堆栈段、附加段。种段组成:代码段、数据段、堆栈段、附加段。语句类别:语句类别: (1)指令语句:指令语句: 由汇编程序汇编成相应的能被由汇编程序汇编成相应的能被CPU直接识别并执行的直接识别并执行的目的码,或称机器代码。
5、目的码,或称机器代码。(2)宏指令语句)宏指令语句: 允许用户为多次重复使用的程序段允许用户为多次重复使用的程序段命名命名的一个名字的一个名字。即将一个程序段定义为一宏指令。即将一个程序段定义为一宏指令。6第三章:汇编语言程序设计第三章:汇编语言程序设计(3)伪指令语句:)伪指令语句: 伪指令语句是一种指示性语句,这类语句向汇编程序伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。元地址、定义各种符号、实现分段等。伪指令与指令性语句的区别:伪指令与指令性语句的区别:
6、伪指令语句经汇编后不产生任何机器代码,而指令伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码;性语句经汇编后会产生相应的机器代码;伪指令语句所指示的操作是在程序汇编时就完成了伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完的,而指令性语句的操作必须在程序运行时才能完成。成。7例3-1:对10个字节数据a1a10求和。DATASEGMENT AT 2000HARRAY DB a ,a ,a , ,aCOUNT EQU ARRAYSUMDW ?DATAENDSSTACK SEGMENT PARA STACK STACKSTAKD
7、B 10 DUP ( ?)TOPEQU LENGTH STAKSTACK ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK汇编语言源程序的格式汇编语言源程序的格式8START:MOV AX,DATA MOV DS,AX MOV AX, MOV DI,OFFSET SUM MOV BX,OFFSET ARRAY MOV CX,COUNTLOP: ADD AL,BX ADC AH, INC BX LOOP LOP MOV DI ,AX MOV AH ,4CH INT 21HCODE ENDS END START汇编语言源程序的格式汇编语言源程序的格式9二、
8、指令性语句二、指令性语句标号:标号: 操作码操作码 操作数操作数 ;注释项注释项操作码:操作码:指明操作的性质,说明计算机要执行的具体指明操作的性质,说明计算机要执行的具体指明操作的性质,说明计算机要执行的具体指明操作的性质,说明计算机要执行的具体操操 作。用助记符表示。作。用助记符表示。操作数:操作数:操作数:操作数:指明指令执行过程中所需的数据。可有指明指令执行过程中所需的数据。可有指明指令执行过程中所需的数据。可有指明指令执行过程中所需的数据。可有0 0个、个、个、个、1 1个个个个 或者多个表达式组成,并由它提供执行指定操作或者多个表达式组成,并由它提供执行指定操作或者多个表达式组成,
9、并由它提供执行指定操作或者多个表达式组成,并由它提供执行指定操作 所需要的操作数或地址。所需要的操作数或地址。所需要的操作数或地址。所需要的操作数或地址。注释项:注释项:必须以分号开头,主要用来说明程序或重要语句必须以分号开头,主要用来说明程序或重要语句 的功能。的功能。汇编语言源程序的格式汇编语言源程序的格式10标号:标号:对应的标识符后面必须跟有冒号,标号在汇编以对应的标识符后面必须跟有冒号,标号在汇编以 后分配有地址。标号又称为符号地址,可作为转后分配有地址。标号又称为符号地址,可作为转 移指令或子程序调用的目标地址。移指令或子程序调用的目标地址。汇编语言源程序的格式汇编语言源程序的格式
10、11汇编语言源程序的格式汇编语言源程序的格式三、指示性语句三、指示性语句 指示性语句是主要由命令构成的语句,用来指示汇编指示性语句是主要由命令构成的语句,用来指示汇编程序进行汇编操作。程序进行汇编操作。格式:格式:名字名字/变量变量 命令命令 参数参数 ;注释项注释项命令:命令:指示汇编程序进行某种汇编操作指示汇编程序进行某种汇编操作参数:参数:汇编操作有关的数据汇编操作有关的数据12汇编语言源程序的格式汇编语言源程序的格式3.2.2 3.2.2 常量、标识符和表达式常量、标识符和表达式常量、标识符和表达式常量、标识符和表达式1 1、常量常量: :数字常量可以是二进制数、八进制数、十进制数或十
11、六进制数表示。字符常量是用单引号 括起来的ASCII字符其值是该字符的ASCII代码值。例: MOV AX,A ;AX=41H 符号常量是用符号定义的常量。例:采用符号定义语句 PORTA EQU 80H MOV AL,PORTA 与指令 MOV AL,80H 等价13 标识符可用作符号常量、名字、变量和标号等。标识符可用作符号常量、名字、变量和标号等。 组成标识符有如下规定:组成标识符有如下规定:u 组成标识符的字符有:组成标识符的字符有: 大写字母:大写字母:A AZ Z;文小写字母:;文小写字母: a az z; 数字数字0 09 9;字符;字符? ?、 、_ _ 、$ $;u 字符长度
12、不超过字符长度不超过3l3l个;首字符不能是数字;个;首字符不能是数字;u ? ? 不能单独作为一个标识符;不能单独作为一个标识符;u不能把保留字用作标识符,保留字包括助记符、寄存不能把保留字用作标识符,保留字包括助记符、寄存 器名等。器名等。 2、标识符、标识符汇编语言源程序的格式汇编语言源程序的格式143 3、表达式、表达式 由常数、变量、标号通过运算符或操作符连接而成由常数、变量、标号通过运算符或操作符连接而成的,可分为数值表达式和地址表达式。的,可分为数值表达式和地址表达式。汇编语言源程序的格式汇编语言源程序的格式u数值表达式:由算术运算符、关系运算符和逻辑运算数值表达式:由算术运算符
13、、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。值常数,只有大小,没有属性。u地址表达式:由变量、标号、常数、寄存器地址表达式:由变量、标号、常数、寄存器(BP、BX、SI、DI)的内容和操作符组成的有意义的式子,它的运的内容和操作符组成的有意义的式子,它的运算结果不是一个普通的数值,总是和存储器地址相联算结果不是一个普通的数值,总是和存储器地址相联系。如各种存储器寻址方式的汇编表示都属于简单的系。如各种存储器寻址方式的汇编表示都属于简单的地址表达式地址表达式15 高 优先级 低1括号中的项,即()和
14、2LENGTH,SIZE,WIDTH,MASK3PTR,OFFSET,SEG,TYPE,THIS4*,/,MOD5+,-6EQ,NE,L,LE,GT,GE7NOT8AND9OR,XOR表达式中的运算符:表达式中的运算符:16汇编语言源程序的格式汇编语言源程序的格式3.2.3 指示性语句(指示性语句(5条)条)程序开始和结束语句程序开始和结束语句段定义语句段定义语句过程定义语句过程定义语句数据定义语句数据定义语句符号定义语句符号定义语句17(1)给程序模块命名)给程序模块命名 NAME 命令命令 格式:格式: NAME 名字名字 名字是程序员按标识符规定所取的程序模块名。名字是程序员按标识符规定
15、所取的程序模块名。(2)标题命名语句)标题命名语句 TITLE 命令命令 格式:格式: TITLE 名字名字 名字作为每页标题打印出来,标题名字符不大于名字作为每页标题打印出来,标题名字符不大于60个个(3)程序结束)程序结束 END命令命令 格式:格式: END 标号标号 标号指示程序开始执行的起始地址的标号。标号指示程序开始执行的起始地址的标号。1、程序开始和结束语句、程序开始和结束语句汇编语言源程序的格式汇编语言源程序的格式18说明:说明:如果程序中没有如果程序中没有NAME 伪指令,可使用伪指令,可使用TITLE伪指令。伪指令。程序中既无程序中既无NAME也无也无TITLE伪指令,汇编
16、程序将用源伪指令,汇编程序将用源程序名作为模块名。程序名作为模块名。一般情况下使用一般情况下使用TITLE伪指令,可在列表文件中能打印伪指令,可在列表文件中能打印出来出来END伪指令中,如果伪指令中,如果程序中第一句指令性语句有标号,程序中第一句指令性语句有标号,则则END语句语句的标号应与其相同否则可无标号。的标号应与其相同否则可无标号。汇编语言源程序的格式汇编语言源程序的格式192、段定义伪指令段定义伪指令 存储器的物理地址是由段地址和偏移地址组合而成的,存储器的物理地址是由段地址和偏移地址组合而成的,而存储器又可以为多个段,汇编程序是按段来组织程序和而存储器又可以为多个段,汇编程序是按段
17、来组织程序和使用存储器,在把源程序转换为目标程序时,必须确定标使用存储器,在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用到段定义伪指令。一起形成一个可执行程序。为此,需要用到段定义伪指令。汇编语言源程序的格式汇编语言源程序的格式20(1)段定义伪指令)段定义伪指令 SEGMENT 格式:格式: 段名段名 SEGMENT 定位类型定位类型 组合类型组合类型类别类别 段名段
18、名 ENDS段名由程序员定义,汇编时由系统为该段分配一个段段名由程序员定义,汇编时由系统为该段分配一个段基值。基值。参数用来设定该段在内存中的位置和在汇编、连接时,参数用来设定该段在内存中的位置和在汇编、连接时,当该段与其它段组合在一起时该段同其它段的连接关当该段与其它段组合在一起时该段同其它段的连接关系。系。汇编语言源程序的格式汇编语言源程序的格式21 一般情况下,定位类型、组合类型和类别说明可以一般情况下,定位类型、组合类型和类别说明可以不用。不用。注意:注意:SEGMENTSEGMENT和和ENDSENDS语句必须成对使用。语句必须成对使用。例:定义一数据段例:定义一数据段DATADAT
19、A DATADATA SEGMENT SEGMENT A DB 1234 A DB 1234 B DW 12H B DW 12H DATA DATA ENDS ENDS汇编语言源程序的格式汇编语言源程序的格式22(2)(2)偏移地址定位语句偏移地址定位语句 ORG格式:格式:ORG ORG 数值表达式数值表达式功能:指定在它之后的程序段或数据块所存放的起始地功能:指定在它之后的程序段或数据块所存放的起始地 址的偏移量。址的偏移量。p无无ORG语句时,段偏移地址从语句时,段偏移地址从0000H开始。开始。例例. DATA SEGMENT. DATA SEGMENT ORG ORG 100H 10
20、0HX X DB 12H DB 12HY Y DW ? DW ?Z Z DD 1122H DD 1122HDATA ENDS DATA ENDS 000011H22H?12HDS: 0100 0101 0102 0103 0104 0105 0106 0107 $p$ $表示汇编地址计数器的当前值表示汇编地址计数器的当前值汇编语言源程序的格式汇编语言源程序的格式23(3 3)指定段址伪指令)指定段址伪指令格式:格式: ASSUME ASSUME 段寄存器:段名段寄存器:段名 ,段寄存器:段名,段寄存器:段名,.功能:指明段和段寄存储器的对应关系,且段名必须是功能:指明段和段寄存储器的对应关系,
21、且段名必须是 由由SEGMENTSEGMENT定义的段名。定义的段名。说明:说明:ASSUMEASSUME伪指令只是指明段和段寄存器的对应关系,并伪指令只是指明段和段寄存器的对应关系,并没有把段地址装入段寄存器中。但是,代码段段寄存没有把段地址装入段寄存器中。但是,代码段段寄存器器CSCS的值是由系统负责设置的。的值是由系统负责设置的。ASSUMEASSUME指令必须跟在指令必须跟在SEGMENTSEGMENT语句之后。语句之后。汇编语言源程序的格式汇编语言源程序的格式24例:例:DATA SEGMENTDATA SEGMENT X DB X DB12H12H DATA ENDS DATA E
22、NDS STACK SEGMENTSTACK SEGMENT DW 100 DUP DW 100 DUP(?)(?) STACK ENDS STACK ENDS CODE SEGMENT CODE SEGMENT ASSUMEASSUME CS:CODECS:CODE,DS:DATADS:DATA,SS:STACKSS:STACK START START:MOV AXMOV AX,DATADATA MOV DS MOV DS,AXAX MOV AX MOV AX,STACKSTACK MOV SS MOV SS,AXAX CODE ENDS CODE ENDS 汇编语言源程序的格式汇编语言源程
23、序的格式253. 3. 过程定义伪指令过程定义伪指令格式为:格式为:过程名过程名 PROC NEAR/FARPROC NEAR/FAR RET RET 过程名过程名 ENDPENDP功能:过程定义伪指令用于定义子程序。段内调用使用功能:过程定义伪指令用于定义子程序。段内调用使用 NEAR NEAR属性,段间调用使用属性,段间调用使用FARFAR属性。省略为属性。省略为NEARNEAR汇编语言源程序的格式汇编语言源程序的格式26CODE SEGMENTCODE SEGMENTCOUNTCOUNT PROC NEAR PROC NEAR ADD CX ADD CX,1 1 RET RETCOUNT
24、COUNT ENDPENDPSTARTSTART:MOV AXMOV AX,100100 CALL COUNT CALL COUNT CALL COUNT CALL COUNT HLT HLTCODE ENDS CODE ENDS END START END STARTCOUNT PROCECOUNT PROCE RET RET子程序:子程序:汇编语言源程序的格式汇编语言源程序的格式274. 4. 数据定义伪指令数据定义伪指令格式:格式: 变量名变量名 数据定义伪指令数据定义伪指令 操作数项表操作数项表功能:定义数据存储区,其类型由伪指令指定。功能:定义数据存储区,其类型由伪指令指定。数据定义
25、伪指令常用的有以下五种:数据定义伪指令常用的有以下五种:变量名变量名 DB 操作数项表操作数项表;定义字节;定义字节变量名变量名 DW 操作数项表操作数项表;定义字;定义字变量名变量名 DD 操作数项表操作数项表;定义双字;定义双字变量名变量名 DQ 操作数项表操作数项表;定义;定义8个字节个字节变量名变量名 DT 操作数项表操作数项表;定义;定义10个字节个字节 操作数项表可以是常数或表达式、字符串、?和带操作数项表可以是常数或表达式、字符串、?和带DUPDUP的表达式的表达式。汇编语言源程序的格式汇编语言源程序的格式28 给变量赋初值或指定变量类型给变量赋初值或指定变量类型 例:例:COU
26、NTCOUNT DB DB100100 ARRAY ARRAY DW DW-1,1024-1,10240400FFFF64存储形式:存储形式:COUNTCOUNT ARRAY ARRAY 100-110240000H0001H0002H0003H0004H0005H0006H汇编语言源程序的格式汇编语言源程序的格式29定义一个定义一个定义一个定义一个ASCASCASCASC码的字符串码的字符串码的字符串码的字符串 为字符串的每个字符分配一个存储单元,为字符串的每个字符分配一个存储单元,为字符串的每个字符分配一个存储单元,为字符串的每个字符分配一个存储单元,并从左到并从左到右将字符的右将字符的A
27、SC码按地址递增顺序存放在内存中。码按地址递增顺序存放在内存中。例例例例1: STR DB ABCD 1: STR DB ABCD 例例例例2: STR1 DW AB2: STR1 DW AB44H42H41H43HSTR:41H42HSTR1STR1:汇编语言源程序的格式汇编语言源程序的格式30 用?号预留用?号预留用?号预留用?号预留内存内存内存内存单元单元单元单元例例例例: SUB1: SUB1DBDB? ;? ;预留一个字节单元预留一个字节单元预留一个字节单元预留一个字节单元 RESURESUDWDW? ; ;预留二个字节单元预留二个字节单元预留二个字节单元预留二个字节单元?SUBSU
28、B1 1:RESURESU:汇编语言源程序的格式汇编语言源程序的格式31 用用用用DUPDUPDUPDUP重复因子初始化一个数据区重复因子初始化一个数据区重复因子初始化一个数据区重复因子初始化一个数据区格式:格式:格式:格式:N DUP N DUP N DUP N DUP (表达式)(表达式)(表达式)(表达式)例例例例1: DA1 DB 2 DUP(0)1: DA1 DB 2 DUP(0)1: DA1 DB 2 DUP(0)1: DA1 DB 2 DUP(0) DA2 DB 2 DUP( DA2 DB 2 DUP( DA2 DB 2 DUP( DA2 DB 2 DUP(ABABABAB) )
29、 ) DA3 DW 2 DUP(1) DA3 DW 2 DUP(1) DA3 DW 2 DUP(1) DA3 DW 2 DUP(1)00010001424142410000DA1DA1DA2DA2DA3DA3例例2 2:DUPDUP的嵌套使用的嵌套使用 DATA DB 10 DUP(10 DUP(0)DATA DB 10 DUP(10 DUP(0) 定义了定义了100100个字节全部初始化为个字节全部初始化为0 0。 重复次数重复次数重复次数重复次数 重复装入的内容重复装入的内容重复装入的内容重复装入的内容 ?、数值、?、数值、?、数值、?、数值、 数值表达式数值表达式数值表达式数值表达式 字
30、符等字符等字符等字符等汇编语言源程序的格式汇编语言源程序的格式32汇编语言源程序的格式汇编语言源程序的格式5、符号定义语句、符号定义语句(1 1)EQUEQU赋值伪指令赋值伪指令格式:格式:变量名变量名 EQU EQU 表达式表达式功能:将右边表达式的值赋给左边的变量。表达式可以是功能:将右边表达式的值赋给左边的变量。表达式可以是 常数、变量、标号、指令助记符、数值表达式、地常数、变量、标号、指令助记符、数值表达式、地 址表达式。址表达式。例:例:PORT1 EQU 100 PORT1 EQU 100 ;符号;符号PORT1PORT1代表常数代表常数100100 CONT EQU CX CON
31、T EQU CX ;为;为CXCX重新命名重新命名 ABDR EQU PORT1+1ABDR EQU PORT1+1 ABC EQU DAA ABC EQU DAA注:注:同一程序中,不能重复定义同一程序中,不能重复定义33(2 2)= =等号伪指令等号伪指令格式:格式:符号名符号名 = = 表达式表达式功能:与功能:与EQUEQU基本相同,两者的区别在于基本相同,两者的区别在于“= =”伪指令可对伪指令可对 同一标识符作重新定义。同一标识符作重新定义。例:例:EMP = 12 ;定义;定义EMP等于等于12 EMP = EMP+1 可以对同一个符号名重复定义。可以对同一个符号名重复定义。汇编
32、语言源程序的格式汇编语言源程序的格式34(3)PURGE命令命令 格式格式 :PUREG 名字名字 功能:功能:用来撤消已定义的符号常量。用来撤消已定义的符号常量。可同时撤消几个己可同时撤消几个己 定义的名字定义的名字 例例3-10: COUNT EQU 20 MOV AL,COUNT PURGE COUNTCOUNT EQU 10MOV BL,COUNT汇编语言源程序的格式汇编语言源程序的格式35(1)名字 名字包括文件名、标题名、段名、过程名和符号常量名等,名字包括文件名、标题名、段名、过程名和符号常量名等,是程序员在编程中按标识符规定命名的,目的是方便编程是程序员在编程中按标识符规定命名
33、的,目的是方便编程和读程。和读程。u段命 在段定义语句中命名取定,定义后的段名可以作为段基值在段定义语句中命名取定,定义后的段名可以作为段基值来使用,用来对段寄存器赋值。来使用,用来对段寄存器赋值。 例:例: MOV AX , DATA MOV DS , AX 6、名字与变量、名字与变量汇编语言源程序的格式汇编语言源程序的格式36u 过程名过程名在过程定义语句中定义,指向过程中第一条指令所在的内在过程定义语句中定义,指向过程中第一条指令所在的内存单元的地址(入口地址),有存单元的地址(入口地址),有NEAR和和FAR之分。之分。u 符号常量符号常量由符号定义语句由符号定义语句EQU、=来定义,
34、对符号常量给以赋值。来定义,对符号常量给以赋值。例例3-13汇编语言源程序的格式汇编语言源程序的格式37(2)变量)变量u 变量的定义和属性变量的定义和属性 变量由数据定义语句变量由数据定义语句DB/DW/DD/DQ/DT来定义来定义变量有三属性:段属性、偏移属性和类型属性:变量有三属性:段属性、偏移属性和类型属性: 段属性表示变量所在段的起始地址。段属性表示变量所在段的起始地址。偏移属性表示变量在段内的偏移地址。用偏移属性表示变量在段内的偏移地址。用16位无符位无符号表示偏移地址。号表示偏移地址。类型属性表示该变量能存放的数据长度。长度为类型属性表示该变量能存放的数据长度。长度为1B的变量,
35、类型为的变量,类型为BYTE,长度为,长度为2B的变量,类型为的变量,类型为WORD等。等。汇编语言源程序的格式汇编语言源程序的格式38u分析运算符(分析运算符(5个)个) 用于把变量的三个属性分别取出来作为操作数。用于把变量的三个属性分别取出来作为操作数。 OFFSET取偏移地址操作符取偏移地址操作符格式:格式:OFFSET 变量或标号变量或标号功能:返回该变量或标号在其段内的偏移地址。功能:返回该变量或标号在其段内的偏移地址。例:例:MOV SI,OFFSET BUFMOV SI,OFFSET BUF 将将BUFBUF在数据段内的偏移地址作为立即数送到在数据段内的偏移地址作为立即数送到SI
36、SI中。中。汇编语言源程序的格式汇编语言源程序的格式39SEG取段址操作符。取段址操作符。格式:格式:SEG SEG 变量或标号变量或标号功能:返回变量或标号所在段的段基址。功能:返回变量或标号所在段的段基址。 例:例: MOV AXMOV AX,SEG BUFSEG BUF汇编语言源程序的格式汇编语言源程序的格式40TYPTYPE E取类型操作符取类型操作符格式:格式:TYPE TYPE 变量或标号变量或标号功能:当功能:当TYPETYPE置于变量前面时,返回变量的类型数字。置于变量前面时,返回变量的类型数字。 即即DBDB为为1 1,DWDW为为2 2,DDDD为为4 4,DTDT为为10
37、10。 当当TYPETYPE置于标号前面时,返回标号的类型属性值;置于标号前面时,返回标号的类型属性值; 当该标号为当该标号为NEARNEAR属性时,返回值为属性时,返回值为1 1,标号为,标号为FARFAR 属性时,返回值为属性时,返回值为2 2。例:数据段中有如下定义:例:数据段中有如下定义:DATA DW 75HDATA DW 75H,134H134H。 执行:执行:ADD SIADD SI,TYPE DATATYPE DATA。 该语句在汇编后相当于指令该语句在汇编后相当于指令ADD SIADD SI,2 2。汇编语言源程序的格式汇编语言源程序的格式41取变量所含的数据存储单元个数操作
38、符取变量所含的数据存储单元个数操作符 LENGTH格式:格式:LENGTH LENGTH 变量变量功能:功能:只对变量起作用,取值根据定义该变量时数据定义只对变量起作用,取值根据定义该变量时数据定义 伪指令后面第一个表达式的形式而定。如为重复子伪指令后面第一个表达式的形式而定。如为重复子 句句“n DUP(n DUP(表达式表达式) )”,返回外层重复因子返回外层重复因子n,其他形其他形式式 的表达式,则返回的表达式,则返回1。 汇编语言源程序的格式汇编语言源程序的格式42MOV AL,LENGTH A1 MOV CX,LENGTH A2 MOV BX, LENGTH A3 MOV DX,LE
39、NGTH A4 汇编后相当于指令:汇编后相当于指令:MOV AL,1MOV CX,10MOV BX,1MOV DX,5例例: DATA SEGMENTA1 DB ABCD,5 DUP(0)A2 DW 10 DUP(1),1234HA3 DW 10,20 DUP(?)A4 DW 5 DUP(3 DUP(2),5) DATA ENDS汇编语言源程序的格式汇编语言源程序的格式43取变量所含的数据存储区大小取变量所含的数据存储区大小操作符操作符 SIZE格式:格式:SIZE SIZE 变量变量功能:汇编程序用该操作符返回的值表示该变量所分配的功能:汇编程序用该操作符返回的值表示该变量所分配的 总字节数
40、。总字节数。 例:例:A2 DW 10 DUP(1),1234HA2 DW 10 DUP(1),1234H MOV CX,SIZE A2MOV CX,SIZE A2 汇编后相当于有指令:汇编后相当于有指令: MOV CX,14HMOV CX,14H汇编语言源程序的格式汇编语言源程序的格式SIZE=LENGTHTYPE44u合成运算符合成运算符属性定义操作符属性定义操作符 PTR格式:格式:类型类型 PTR PTR 地址表达式地址表达式功能:功能:PTRPTR操作符的作用是将地址表达式的原类型属性临操作符的作用是将地址表达式的原类型属性临 时修改成时修改成PTRPTR操作符前面所指定的类型。指定
41、的类操作符前面所指定的类型。指定的类 型可以是型可以是BYTEBYTE、WORDWORD或或DWORDDWORD。p可用来指定内存操作数的类型可用来指定内存操作数的类型 例:例:MOVMOV BYTE PTR BYTE PTR SISI, , 20H20H ;占一个字节;占一个字节 或或 MOVMOV WORD PTR WORD PTR SISI, , 20H 20H ;占两个字节;占两个字节汇编语言源程序的格式汇编语言源程序的格式45p 用于临时改变变量或标号的类型属性用于临时改变变量或标号的类型属性 例如:例如:BUFW DW 1234H, 5678H MOV AX, BUFW MOV A
42、L , BYTE PTR BUFWp 可用可用EQU 和和PTR定义一个新的变量定义一个新的变量 例如例如 :BUFW DW 1234H , 5678H BUFB EQU BYTE PTR BUFW 则则 MOV AX , BUFW 和和 MOV AL , BUFB 都是合法的。都是合法的。汇编语言源程序的格式汇编语言源程序的格式46 格式格式 : 标号:标号: 操作码操作码 操作数操作数 ,操作数,操作数 ;注释;注释 一、标号一、标号 标号是一条指令在内存中的符号地址。标号一定要用标号是一条指令在内存中的符号地址。标号一定要用:结束。标号具有三种属性:结束。标号具有三种属性:u 段属性:表
43、示标号所在段的段基值段属性:表示标号所在段的段基值 格式:格式:SEG 标号标号 3.2.4 指令型语句指令型语句汇编语言源程序的格式汇编语言源程序的格式47汇编语言源程序的格式汇编语言源程序的格式u偏移量属性:表示标号所在位置的偏移地址偏移量属性:表示标号所在位置的偏移地址 格式:格式:OFFSET 标号标号u 类型属性:表示标号所在指令是允许段内跳转还是类型属性:表示标号所在指令是允许段内跳转还是 段间跳转段间跳转 格式:格式:TYPE 标号标号当标号的属性为当标号的属性为NEAR属性时,属性时,TYPE=-1。当标号的属性为当标号的属性为FAR属性时,属性时,TYPE=-2。48操作数可
44、以用段名、符号常量、变量、属性表达式、过程名操作数可以用段名、符号常量、变量、属性表达式、过程名和标号等。例如:和标号等。例如:MOV AX , DATA ;DATA是段名是段名MOV CX , COUNT ; COUNT 是符号常量是符号常量MOV BL , BUFFER ; BUFFER 是变量是变量MOV SI , OFFSET ARRAY;OFFSET ARRAY是属是属;性表达式;性表达式CALL SBRT1 ;SBRT1 是过程名是过程名JMP DONE ; DONE 是标号2、操作数、操作数汇编语言源程序的格式汇编语言源程序的格式49u宏定义:宏定义:格式:格式: 宏指令名宏指令
45、名 MACRO MACRO 形式参数表形式参数表 ENDM ENDMu宏调用:宏调用:格式:格式: 宏指令名宏指令名 实际参数,实际参数,宏指令体宏指令体宏指令宏指令源程序中一个能多次可重复使用的具有独立功能源程序中一个能多次可重复使用的具有独立功能 的代码段。的代码段。1、宏指令的定义和使用、宏指令的定义和使用 宏指令的使用过程有宏定义、宏调用、宏展开。宏指令的使用过程有宏定义、宏调用、宏展开。3.2.5 宏指令宏指令汇编语言源程序的格式汇编语言源程序的格式50例:完成例:完成AXAX的内容乘以的内容乘以2 2X X的宏定义及宏调用的宏定义及宏调用定义宏:定义宏:MULX MACRO PX
46、MULX MACRO PX 形式参数形式参数 宏指令名宏指令名 MOV CL MOV CL,PXPX SAL AX SAL AX,CLCL ENDM ENDM宏调用:宏调用: MULX 2 ; MULX 4 ; MULX 5 ;实际参数实际参数AX(AX)*22AX(AX)*24AX(AX)*25汇编语言源程序的格式汇编语言源程序的格式51宏调用:宏调用: MULT MULT 120 120,BLBL,SAVE SAVE u宏展开:宏展开:在汇编宏指令时,宏汇编程序将宏指令体插入到宏指令在汇编宏指令时,宏汇编程序将宏指令体插入到宏指令所在的位置,并用实际参数代替形式参数所在的位置,并用实际参数
47、代替形式参数。例:两数相乘,返回积。例:两数相乘,返回积。宏定义:宏定义:MULT MACRO OPR1,OPR2,RESULT MOV AL,OPR1 IMUL OPR2 MOV RESULT,AX ENDM MOV AL,120 IMUL BL MOV SAVE,AX汇编语言源程序的格式汇编语言源程序的格式522 2、宏指令与宏指令与子程序(子程序(过程过程)的区别:的区别:宏指令调用无返回地址宏指令调用无返回地址,执行速度略快。,执行速度略快。通过形参、实参结合传递函数通过形参、实参结合传递函数宏指令不能压缩目标代码长度宏指令不能压缩目标代码长度,占用内存较子程大。,占用内存较子程大。汇
48、编语言源程序的格式汇编语言源程序的格式53 3.3.1 3.3.1 概述概述 3.3.2 3.3.2 顺序程序顺序程序 3.3.3 3.3.3 分支程序分支程序 3.3.4 3.3.4 循环程序循环程序 3.3.5 3.3.5 子程序子程序 3.3.6 3.3.6 汇编语言程序举例汇编语言程序举例 3.3.7 3.3.7 系统功能调用系统功能调用3.3 汇编语言程序设计基础汇编语言程序设计基础543.3.7 3.3.7 常用的常用的DOSDOS与与BIOSBIOS中断功能调用中断功能调用1. DOS1. DOS中断中断 DOSDOS除了给用户提供了命令行服务以外,还为汇编除了给用户提供了命令行
49、服务以外,还为汇编语言程序员语言程序员提供提供了了大量的子程序大量的子程序,这些子程序包含了从,这些子程序包含了从基本输入输出到内存管理、磁盘读写、文件系统等各个基本输入输出到内存管理、磁盘读写、文件系统等各个方面,使用这些子程序,使得汇编语言程序员不必搞清方面,使用这些子程序,使得汇编语言程序员不必搞清大量的设备接口、数据结构等细节,即可完成所需功能,大量的设备接口、数据结构等细节,即可完成所需功能,简化了汇编语言的编程。由于简化了汇编语言的编程。由于DOSDOS提供的这些子程序被看提供的这些子程序被看作是作是DOSDOS系统功能的一部分,因而人们把对这些子程序的系统功能的一部分,因而人们把
50、对这些子程序的调用又称为调用又称为DOSDOS功能调用功能调用。一、一、DOSDOS中断与系统功能调用中断与系统功能调用55 DOSDOS提供的这些子程序位于提供的这些子程序位于DOSDOS的基本系统文件的基本系统文件IBMBIO.COMIBMBIO.COM和和IBMDOS.COMIBMDOS.COM中,随着中,随着DOSDOS的加载而进入内存,的加载而进入内存,即只要能启动即只要能启动DOSDOS就可以使用。就可以使用。DOSDOS的这些子程序是以中的这些子程序是以中断的方式向系统及应用程序提供服务的,故必须断的方式向系统及应用程序提供服务的,故必须采用采用软软中断指令中断指令INTINT进
51、行调用。进行调用。 随着随着DOSDOS的发展,所提供的功能的发展,所提供的功能( (子程序子程序) )越来越多,越来越多,不可能每一个子程序都占用一个中断号,于是采用让它不可能每一个子程序都占用一个中断号,于是采用让它们们共用一个中断号共用一个中断号,即,即21H21H号的办法,进入这一个中断后,号的办法,进入这一个中断后,DOSDOS再根据应用户程序中再根据应用户程序中子程序编号子程序编号的设置来确定用户程的设置来确定用户程序到底想调用哪一个子功能。序到底想调用哪一个子功能。常用的常用的DOS与与BIOS中断功能调用中断功能调用562. DOS2. DOS系统功能调用系统功能调用 (1 1
52、)DOSDOS功能调用的方法功能调用的方法p设置入口参数,如果所调用的子程序不需参数,则设置入口参数,如果所调用的子程序不需参数,则可省略此步。可省略此步。p欲调用的子程序编号欲调用的子程序编号AHAH。p发中断调用指令发中断调用指令INT 21HINT 21H。常用的常用的DOS与与BIOS中断功能调用中断功能调用57 (2 2)DOSDOS基本基本I/OI/O功能调用功能调用p 01功能功能键盘输入键盘输入 入口参数:无入口参数:无 出口参数:所读取的字符出口参数:所读取的字符ASCIIASCII码在码在ALAL内。内。功能:扫描键盘,若有按键按下,将字符功能:扫描键盘,若有按键按下,将字
53、符ASCIIASCII码放入码放入ALAL 中,同时在屏幕上显示这个字符,然后返回。若中,同时在屏幕上显示这个字符,然后返回。若 无键按下,该调用等待直到有键按下为止。无键按下,该调用等待直到有键按下为止。例:例: MOV AH , 01MOV AH , 01 INT 21H INT 21H常用的常用的DOS与与BIOS中断功能调用中断功能调用58p 08功能功能键盘输入。键盘输入。入口参数:无入口参数:无 出口参数:所读取的字符出口参数:所读取的字符ASCII码在码在AL内。内。 功能:同功能:同0101号类似,但是不在屏幕上显示输入的字号类似,但是不在屏幕上显示输入的字 符,在读取密码时常
54、用本功能。符,在读取密码时常用本功能。例:例: MOV AH , 08MOV AH , 08 INT 21H INT 21H常用的常用的DOS与与BIOS中断功能调用中断功能调用59p 10 10号功能号功能字符串输入字符串输入入口参数入口参数:DSDS:DXDX指向输入缓冲区。指向输入缓冲区。输入缓冲区具有如下格式:输入缓冲区具有如下格式:u第一个字节:指明准备接收的最大字符数,包括回车第一个字节:指明准备接收的最大字符数,包括回车符。符。u第二个字节保留,由第二个字节保留,由DOSDOS在功能调用结束后填入实际输在功能调用结束后填入实际输入的字符个数入的字符个数( (不包括最后的回车符不包
55、括最后的回车符) )。u用户输入的字符串从第三个单元开始存放用户输入的字符串从第三个单元开始存放出口参数出口参数:用户实际输入字符个数在缓冲区第二个单元中:用户实际输入字符个数在缓冲区第二个单元中常用的常用的DOS与与BIOS中断功能调用中断功能调用60DATA SEGMENTDATA SEGMENTBUF DB BUF DB 8 8 ; ;指明最大字符数指明最大字符数 DB ?DB ? ; ;保留,供保留,供DOSDOS填入实际字符数填入实际字符数 DB 8 DUP(?) ;DB 8 DUP(?) ;用户输入的字符存放区用户输入的字符存放区DATA ENDSDATA ENDSCODE SEG
56、MENTCODE SEGMENT ASSUME CS:CODE , DS:DATA ASSUME CS:CODE , DS:DATASTART: MOV AX , DATASTART: MOV AX , DATA MOV DS , AX MOV DS , AX MOV DX , OFFSET BUFMOV DX , OFFSET BUF MOV AH , 10 MOV AH , 10 INT 21H INT 21H ; ;其他操作其他操作 MOV AH , 4CHMOV AH , 4CH INT 21H INT 21HCODE ENDCODE END常用的常用的DOS与与BIOS中断功能调用中
57、断功能调用61p 02H02H功能功能显示字符(一个字符)显示字符(一个字符) 调用方法:调用方法:DLDL要显示的字符或其要显示的字符或其ASCASC代码代码 AH02HAH02H INT 21HINT 21H 注:如果字符是控制符,则实际执行相应的功能。注:如果字符是控制符,则实际执行相应的功能。 例:在屏幕上显示一个换行符例:在屏幕上显示一个换行符(0AH)(0AH)MOV DLMOV DL,0AH0AHMOV AHMOV AH,0202INT 21H INT 21H ;实际上将光标转到下一行上去。;实际上将光标转到下一行上去。常用的常用的DOS与与BIOS中断功能调用中断功能调用62p
58、 09H 09H功能功能字符串输出显示字符串输出显示 调用方法:调用方法:DXDX要显示的字符串首地址要显示的字符串首地址 AH09HAH09H(调用号)(调用号) INT 21HINT 21H注:预先将字符串存放于注:预先将字符串存放于DXDX表示的首地址区域,字符串表示的首地址区域,字符串 必须以必须以“$ $”作为结束符作为结束符常用的常用的DOS与与BIOS中断功能调用中断功能调用63p4CH4CH功能功能终止当前程序并返回操作系统。终止当前程序并返回操作系统。 调用方法:调用方法: MOV AHMOV AH,4CH4CH INT 21HINT 21H常用的常用的DOS与与BIOS中断
59、功能调用中断功能调用64例:编一段程序先提示用户输入一个字符串,然后读取用户例:编一段程序先提示用户输入一个字符串,然后读取用户的输入,并将用户输入的数据在下行输出。的输入,并将用户输入的数据在下行输出。程序如下:程序如下:DATA SEGMENTDATA SEGMENTMESSAGE DB MESSAGE DB PLEASE INPUT A STRING: $PLEASE INPUT A STRING: $; ;定义输入提示定义输入提示BUF DB 10 , ? , 10 DUP(BUF DB 10 , ? , 10 DUP(?) ) DATA ENDSDATA ENDS MOV DX ,
60、OFFSET MESSAGEMOV DX , OFFSET MESSAGE MOV AH , 9MOV AH , 9 INT 21H INT 21H; ;显示输入提示信息显示输入提示信息CODE SEGMENTCODE SEGMENT ASSUME CS: CODE , DS: DATA ASSUME CS: CODE , DS: DATASTART: MOV AX , DATASTART: MOV AX , DATA MOV DS , AX MOV DS , AXDOS 功能调用举例功能调用举例65MOV DX , OFFSET BUFMOV DX , OFFSET BUFMOV AH ,
61、10MOV AH , 10INT 21HINT 21H ; ;接收用户输入接收用户输入MOV AH , 4CHMOV AH , 4CHINT 21HINT 21HCODE ENDSCODE ENDSEND STARTEND STARTMOV DX , OFFSET BUF+2 ;MOV DX , OFFSET BUF+2 ;用户实际输入字符起始处用户实际输入字符起始处DXDXMOV AH , 9MOV AH , 9INT 21HINT 21H ; ;显示用户输入的字符显示用户输入的字符MOV BL , BUF+1MOV BL , BUF+1 ; ;用户实际输入字符数用户实际输入字符数BLBLM
62、OV BH , 0MOV BH , 0 ; ;将将BXBX高高8 8位清位清0 0,使,使BX=BX=用户实际输入字符数用户实际输入字符数MOV BYTE PTR BUF+2BX,$MOV BYTE PTR BUF+2BX,$; ;在用户输入的字符结束处放置一个在用户输入的字符结束处放置一个“$ $”MOV AH , 2MOV AH , 2MOV DL , 0AHMOV DL , 0AH ;0AH ;0AH为换行符为换行符ASCIIASCII码码INT 21HINT 21H ; ;屏幕换行屏幕换行DOS 功能调用举例功能调用举例663.3.1 概述概述程序:程序:是完成特定功能的一组指令的有序
63、集合是完成特定功能的一组指令的有序集合一、程序设计的步骤一、程序设计的步骤n分析课题分析课题n确定算法确定算法n画流程图画流程图n编写程序编写程序n上机调试、修改上机调试、修改二、程序的基本结构二、程序的基本结构 顺序结构、分支结构、循环结构和子程序结构。顺序结构、分支结构、循环结构和子程序结构。汇编语言程序设计基础汇编语言程序设计基础673.3.2 3.3.2 顺序程序设计顺序程序设计 程序有程序有3种基本结构,即顺序结构、分支结构和循种基本结构,即顺序结构、分支结构和循环结构。任何复杂的程序都是由基本结构组成的。顺环结构。任何复杂的程序都是由基本结构组成的。顺序程序是最简单程序设计。序程序
64、是最简单程序设计。特点:特点:u这种程序不使用分支、循环结构,程序按顺序执行,这种程序不使用分支、循环结构,程序按顺序执行,只能完成相对简单的操作。只能完成相对简单的操作。u硬件支持是硬件支持是IP自动加自动加1,从内存取出一个指令字节,从内存取出一个指令字节,IP自动加自动加1。顺序程序设计顺序程序设计68例例例例3-17 3-17 3-17 3-17 查表求平方值查表求平方值查表求平方值查表求平方值程序分析:程序分析:(1)在内存中建平方表)在内存中建平方表TABL;在;在XX单元放置单元放置015的数;在的数;在YY单元预留存储平方值的单元。单元预留存储平方值的单元。(2)计算表启始地址
65、的偏移量)计算表启始地址的偏移量(3)计算所查数值在表中的偏移地址,从该地址取出单)计算所查数值在表中的偏移地址,从该地址取出单元的内容送元的内容送YY单元。单元。 69DATA SEGMENTTABL DB 0,1,4,9,16,25,36,49,64,81 DB 100,121,144,169,196,225XX DB X ;X为015的正整数YY DB ?DATA ENDSSTACK SEGMENT PARA STACKSTACK DB 50 DUP(?)STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK 顺序程序设计举例顺序程
66、序设计举例顺序程序设计举例顺序程序设计举例例例3-17 查表求平方值查表求平方值70BEGIN: MOV AX,DATAMOV DS,AXMOV BX,OFFSET TABLMOV AH,0MOV AL,XXADD BX,AXMOV AL,BXMOV YY,ALMOV AH,4CHINT 21HCODEENDSEND BEGIN 顺序程序设计举例顺序程序设计举例顺序程序设计举例顺序程序设计举例71例例31:从键盘输入两个一位数,在屏幕显示它们的积。:从键盘输入两个一位数,在屏幕显示它们的积。程序分析:程序分析:(1)从键盘上输入两个数,调用)从键盘上输入两个数,调用DOS 01功能。功能。(2
67、)把)把AL中的中的ASCII码转换为数值。码转换为数值。(3)两数相乘,把积用)两数相乘,把积用ASCII码表示。码表示。(除除10)(4)把积显示在屏幕上,调用)把积显示在屏幕上,调用02功能。功能。顺序程序设计举例顺序程序设计举例顺序程序设计举例顺序程序设计举例72CODESEGMENTASSUME CS:CODEBEGIN:MOV AH,1INT21HMOV BL,ALINT21HSUBAL,30HSUBBL,30HMULBLMOV BL,10DIVBL顺序程序设计举例顺序程序设计举例顺序程序设计举例顺序程序设计举例73ADD AX,3030HMOV BX,AXMOV DL,BLMOV
68、 AH,02HINT 21HMOV DL,BHINT21HMOV AH,4CHINT 21HCODE ENDSEND BEGIN顺序程序设计举例顺序程序设计举例顺序程序设计举例顺序程序设计举例74例例: 字节存储单元字节存储单元DAT中有中有2位数据为位数据为65H,要求将该数据显示到屏幕上。,要求将该数据显示到屏幕上。DATADATA SEGMENTSEGMENTDATDAT DB DB65H65HDATADATA ENDS ENDSCODECODE SEGMENTSEGMENT ASSUME CS ASSUME CS:CODE,DSCODE,DS:DATADATASTARTSTART: M
69、OVMOVAX,DATAAX,DATA MOV MOVDS,AXDS,AX MOV MOVDL,DATDL,DAT MOV MOVBL,DLBL,DL ; ;暂存至暂存至ALAL寄存器寄存器 MOVMOVCL,4CL,4 SHR SHRDL,CLDL,CL ADD ADDDL,30HDL,30H ; ;高位十六进制数据高位十六进制数据6 6转换为转换为ASCIIASCII码码 MOVMOVAH,02HAH,02H INT INT21H ;21H ;显示显示 MOVMOVDL,BLDL,BL AND ANDDL,0FHDL,0FH OR ORDL,30HDL,30H ; ;低位十六进制数据低位十
70、六进制数据5 5转换为转换为ASCIIASCII码码 INTINT21H ;21H ;显示显示 MOVMOVAHAH,4CH4CH INT INT21H21HCODECODEENDSENDS END ENDSTARTSTART751. 分支程序二要素分支程序二要素(1) 判断判断:运算结果的状态标志运算结果的状态标志CF,PF,ZF,SF, OF;(2) 转移转移 :主要是条件转移指令:主要是条件转移指令Jcc 单标志位判断单标志位判断JC,JZ,JO,JP,JS,JAE等等;多标志位判断多标志位判断JA,JG,JGE等。等。 3.3.3 分支结构程序分支结构程序分支结构程序分支结构程序分支结
71、构程序分支结构程序76分支结构程序分支结构程序分支结构程序分支结构程序2. 采用比较指令和转移指令实现分支采用比较指令和转移指令实现分支 CMP Dest,src; Dest-src Jcc 标号标号77例:例:在字节存储单元在字节存储单元X、Y中各有一个无符号数。根据这中各有一个无符号数。根据这两个无符号数的大小,在屏幕显示两个无符号数的大小,在屏幕显示XY或或XY。分析:用分析:用CMP指令比较两个无符号数大小,根据其对标指令比较两个无符号数大小,根据其对标志位的影响用无符号条件转移指令实现转移。志位的影响用无符号条件转移指令实现转移。1、比大小:、比大小:XAL,比较,比较AL与与Y的大
72、小。的大小。2、调用、调用02功能显示比较结果。功能显示比较结果。 分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例78 DATA SEGMENTXDB98HYDB0A0HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOVDS,AXMOVAL,XCMPY,AL;比较比较JAYGX;Y大于大于X则转则转YGEXMOVAL,JMPDISP分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例79YGX:MOV AL,DISP:MOV DL,X ;显示比较结果显示比较结果MOV AH,2 INT21
73、HMOV DL,ALINT21HMOV DL,YINT21HMOV AH,4CHINT21HCODE ENDS END START分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例80例例3-20:数据块传送程序:数据块传送程序程序分析:程序分析:(1)用字符串传送指令)用字符串传送指令MOVSB实现数据块传送。实现数据块传送。 目的串偏移地址送目的串偏移地址送DI,源串偏移地址送,源串偏移地址送SI。(2)如何判断源数据块与目的数据块是否有交叠:)如何判断源数据块与目的数据块是否有交叠: 两数据块不交叠的条件是:两数据块不交叠的条件是: 源数据块末地址源数据块末地址目的数据块首
74、地址目的数据块首地址 不重叠不重叠DF置置0,重叠从末地址开始传送,重叠从末地址开始传送DF置置1分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例81DATASEGMENTSTRG DB 1000 DUP (?)STG1EQU STRG+7STG2EQU STRG+25STRSEEQU 50DATA ENDSSTACKSEGMENT PARA STACK STACKSTARNDB 100 DUP (?)STACKENDS例例3-20:数据块传送程序:数据块传送程序分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例82COSEGSEGMENTASSUME CS:CO
75、SEG, DS:DATA,ES:DATA,SS:STACK MOV AX,DATAMOV DS,AXMOV ES,AXMOV CX,STRSEMOV SI,OFFSET STG1MOV DI,OFFSET STG2CLDPUSH SIPUSH SIADD SI,STRSE ADD SI,STRSE 1 1分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例83CMP SI,DICMP SI,DIPOP SIPOP SIJB OKJB OKSTDSTD; ;减量方式传送减量方式传送 ADD DI,STRSE ADD DI,STRSE 1 1 ; ;指向数据块底部指向数据块底部ADD
76、SI,STRSE ADD SI,STRSE 1 1OK:OK: REP MOVSBREP MOVSB ; ;重复传送重复传送5050个数据个数据MOV AH,4CHMOV AH,4CHINT 21H INT 21H CODE ENDSCODE ENDSEND BEGINEND BEGIN分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例84在在内存中连续存放的一系列跳转地址、跳转指令或关键内存中连续存放的一系列跳转地址、跳转指令或关键字组成一个决定程序分支的跳转表。字组成一个决定程序分支的跳转表。 主要问题是计算表地址主要问题是计算表地址表地址表地址=表基地址表基地址+偏移量偏移
77、量3、利用跳转表实现分支、利用跳转表实现分支分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例85例例3-21:某工厂有:某工厂有8种产品种产品的加工程序的加工程序R0R7,分别放分别放在以在以SBR0、SBR1SBR7为首地址的内存区域中为首地址的内存区域中,8个个地址的偏移地址放在以地址的偏移地址放在以BASE为首地址的跳转表内。为首地址的跳转表内。跳转地址组成的跳转表:跳转地址组成的跳转表:分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例86DATASEGMENTBASEDW SBR0, SBR1, SBR2, SBR3DW SBR4, SBR5, SBR6
78、, SBR7BNDB X ;X为07之间的正整数DATAENDSCOSEGSEGMENTASSUME CS:COSEG, DS:DATAMOV AX,DATAMOV DS,AXMOV AL,BN 分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例87MOV AH,0ADD AL,ALMOV BX,OFFSET BASEADD BX,AXMOV AX,BXJMP AXMOV AL,4CHINT 21HCODEG ENDSEND BEGIN 分支结构程序举例分支结构程序举例分支结构程序举例分支结构程序举例88 3.3.4 循环结构程序循环结构程序 在进行程序设计时,会出现某段程序反复
79、多次执行在进行程序设计时,会出现某段程序反复多次执行的情况,则可用循环程序结构来实现。采用循环程序结的情况,则可用循环程序结构来实现。采用循环程序结构不仅使程序变得简洁清晰,而且减少程序对内存的占构不仅使程序变得简洁清晰,而且减少程序对内存的占用。用。1、循环程序的结构、循环程序的结构 循环程序一般由循环程序一般由4部分构成:部分构成:循环结构程序循环结构程序循环结构程序循环结构程序89(1)初始化部分)初始化部分 为循环程序作准备工作,如置循环次数、地址指针为循环程序作准备工作,如置循环次数、地址指针或关键字,寄存器置初值及标志位设置等。或关键字,寄存器置初值及标志位设置等。(2) 循环工作
80、部分循环工作部分 是循环结构的主体。是循环结构的主体。(3) 参数调整部分参数调整部分 地址指针或循环次数的修改等,以便继续循环。地址指针或循环次数的修改等,以便继续循环。(4)循环控制部分)循环控制部分 循环条件的检查,以判断是否继续循环。循环条件的检查,以判断是否继续循环。循环结构程序循环结构程序循环结构程序循环结构程序90(a) 先工作后判断循环条件先工作后判断循环条件(b) 先判断循环条件后工作先判断循环条件后工作循环结构程序循环结构程序循环结构程序循环结构程序2、循环程序结构、循环程序结构91DATA SEGMENTTABLE DW a1, a2, a3, a4, a5, a6,a7
81、, a8, a9, a10 DW a11, a21,.a20 . DW a91,a92, a100 YY DW ?DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATAMOV AX,DATAMOV DS,AX 3、循环程序举例、循环程序举例i=1,2,100例3-23 计算Y= 循环结构程序循环结构程序循环结构程序循环结构程序92 MOV AX , 0 MOV BX , OFFSET TABL MOV CX , 100 LOP : ADD AX , BX INC BX INC BX DEC CX JNZ LOP MOV YY ,AX MOV AH ,4CH I
82、NT 21H CODEDEGMENTEND BEGIN 循环结构程序循环结构程序循环结构程序循环结构程序93例例3-4 统计数组中负元素的个数统计数组中负元素的个数分析:分析:(1)在数据段中放入若干个带符号数,并计算个数。)在数据段中放入若干个带符号数,并计算个数。(2)设计一个计数器)设计一个计数器(2)从数据段中取数并判断是否负数,若是计数器加)从数据段中取数并判断是否负数,若是计数器加1。 设计成循环程序。设计成循环程序。 初始化:计数器清初始化:计数器清0,用,用OFFSET取偏移地址,置循取偏移地址,置循 环次数。环次数。 与与0相比,用带符号跳转指令相比,用带符号跳转指令JGE判
83、正负,满足条判正负,满足条 件,计数器加件,计数器加1,修改参数。否则直接修改参数,修改参数。否则直接修改参数 。循环结构程序循环结构程序循环结构程序循环结构程序94 数据块的定义如下:数据块的定义如下:DATASEGMENTD1DB -1,-3,5,6,-9;定义数组定义数组COUNTEQU $ -D1RSDW ?;存放负数个数存放负数个数DATA ENDS 循环结构程序循环结构程序循环结构程序循环结构程序95代码段程序为:代码段程序为:CODESEGMENTASSUME CS:CODE, DS:DATAMOV AX,DATAMOV DS,AXMOV BX,OFFSET D1;建立数据指针
84、MOV CX, COUNT ;设置计数器初值MOV DX,0;设置结果初值 循环结构程序循环结构程序循环结构程序循环结构程序96 LOP1:MOV AL,BXCMP AL,0JGE JUSINC DXJUS: INC BXDEC CXJNZ LOP1 ;或LOOP LOP1MOV RS,DXMOV AH,4CHINT 21HCODESEGMENTEND BEGIN 97 MOV CX , 0LOP : AND AX , AX JZ STP SAL AX , 1 JNC LOP INC CX JMP LOPSTP : HLT这是一个这是一个 ” 先判断后执行先判断后执行 “的结构的结构。例例3-
85、25 统计寄存器统计寄存器AX中中1的个数的个数循环结构程序循环结构程序循环结构程序循环结构程序983.3.5 子程序定义及结构子程序定义及结构一、概述一、概述1、子程序结构、子程序结构(1)结构:子程序的第一条语句前有过程名)结构:子程序的第一条语句前有过程名入口地址的符入口地址的符 号表示出口是返回指令号表示出口是返回指令RET。 (2)调用与返回调用与返回:主程序用主程序用CALL指令调用子程序,子程序用指令调用子程序,子程序用 RET指令返回主程序指令返回主程序(3)子程序文件:子程序说明与子程序子程序文件:子程序说明与子程序清清单单。 子程序定义及结构子程序定义及结构99子程序说明:
86、子程序说明:功功能能描描述述:包包括括子子程程序序名名称称、功功能能以以及及性性能能指指标标(如如执执行时间行时间)等;等;所用寄存器和存储单元;所用寄存器和存储单元;子程序的入口、出口参数;子程序的入口、出口参数;子程序中又调用的其它子程序;子程序中又调用的其它子程序;调用实例调用实例(可无可无)。 子程序定义及结构子程序定义及结构100u主程序与子程序的连接主程序与子程序的连接u寄存器和工作单元中内容的保护,即保护现场,用寄存器和工作单元中内容的保护,即保护现场,用PUSH指令和指令和POP指令,可以安排在子程序中,也可指令,可以安排在子程序中,也可以安排在主程序中。通常安排在子程序中。以
87、安排在主程序中。通常安排在子程序中。u参数的传递,即主程序如何把入口参数带入子程序,参数的传递,即主程序如何把入口参数带入子程序,子程序又如何把出口参数带回主程序子程序又如何把出口参数带回主程序。 子程序应用中应注意的问题:子程序应用中应注意的问题:子程序定义及结构子程序定义及结构101 主程序名为主程序名为MAIN,子程序名为子程序名为SUM。采用堆栈传递参数。采用堆栈传递参数,即主程序把参数压入栈,子程序出栈即主程序把参数压入栈,子程序出栈。 (1)在存储器中开辟一个在存储器中开辟一个20个字的堆栈段,并计算栈个字的堆栈段,并计算栈顶偏移地址:顶偏移地址: STACK SEGMENT PA
88、RA STACK SPAE DW 20 DUP(?) TOP EQU LENGTH SPAE STACK ENDS例例3-28 求数组之和求数组之和子程序定义及结构子程序定义及结构102DATA SEGMENTARY1DB 100 DUP(?)SUM1DW ?ARY2DB 150 DUP(?)SUM2DW ?COUNT1EQU SUM1-ARY1 COUNT2EQUSUM2-ARY2DATA ENDS(2)在内存数据段中放置两个数组)在内存数据段中放置两个数组ARY1,ARY2,预留,预留求和单元并计算数组的长度。求和单元并计算数组的长度。子程序定义及结构子程序定义及结构103定义代码段:定义
89、代码段:MAIN SEGMENT ASSUME CS: MAIN, DS: DATA, SS: STACK MOV AX,DATA MOV DS,AX传递参数调用子程序:传递参数调用子程序: MOV AX,SIZE ARY1 PUSH AX MOV AX,OFFSET ARY1 PUSH AX CALL SUM(3)数据求和主程序)数据求和主程序子程序定义及结构子程序定义及结构104MOV AX,SIZE ARY2PUSH AXMOV AX,OFFSET ARY2 PUSH AXCALL SUMHLTMAIN ENDSEND STR 子程序定义及结构子程序定义及结构105求数组之和求数组之和求
90、数组之和求数组之和定义子程序代码段并保护现场:定义子程序代码段并保护现场:PROCESEGMENTASSUME CS:PROCE,DS:DATA,SS:STACKSUM PROC FARPUSH AXPUSH BXPUSH CXPUSH BPPUSHFMOV BP,SP (4)求和子程序)求和子程序子程序定义及结构子程序定义及结构106通过堆栈传递数组的个数和偏移地址:通过堆栈传递数组的个数和偏移地址:MOV CX, BP+16 MOV BX, BP+14数组求和:数组求和:MOV AX,0ADN:ADD AL,BXINC BXADC AH,0LOOP ANDMOV BX,AX子程序定义及结构
91、子程序定义及结构107恢复现场返回主程序:恢复现场返回主程序:POPFPOP BPPOP CXPOP BXPOP AXRETSUMENDPRPOCEENDS子程序定义及结构子程序定义及结构108 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例3.2.6 汇编语言程序举例汇编语言程序举例例例3-30 3-30 将将ASCIIASCII码表示的两位十进制数转换成一字节二进码表示的两位十进制数转换成一字节二进 制数。(制数。(37H37H,39H39H)分析:分析:39H是个位,用减法指令是个位,用减法指令SUB减减30即可得。即可得。 37H是十位,是十位,70=7X(23+2)
92、可得。)可得。 把所得的十位和个位数相加即可。把所得的十位和个位数相加即可。109DATA SEGMENTASDEC DB 37H,39HBIN DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX (1)定义数据段和代码段:)定义数据段和代码段: 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例110MOV SI,OFFSET ASDECMOV AL,SI ;取第一个数(十位数);取第一个数(十位数)SUB AL,30H;十十进制数进制数ASCIISAL AL,1 ;乘;乘2M
93、OV BL,AL;BL=7X2 MOV CL,2SAL AL,CL;7X23ADD BL,AL;7X2+7X23=70(2)取第一个数并转为)取第一个数并转为2进制数进制数 方法:方法:37H07H 70=7X(23+2)+ (39H 09H) 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例111 INC SI MOV AL,SI;取第二个数(个位数) SUB AL,30H;二进制数ASC ADD AL,BL;十位数+个位数 MOV BIN,AL;存入BIN MOV AH,4CH INT 21HCODE ENDS END START (3)取第二个数,)取第二个数,ASCII
94、二进制数,两数相加。二进制数,两数相加。 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例112算法:算法:二进制二进制十进制十进制 ASCII。 二进制二进制十进制十进制: 二二进进制制数数反反复复减减100,够够减减计计数数器器加加1,直直到到不不够够减减为为止止。计数器中的数就是计数器中的数就是100的个数的个数,即百位数。,即百位数。 十位数相同。十位数相同。 最最后后一一次次的的结结果果(差差)为为负负,要要加加10以以恢恢复复原原值值,这这就就是是个个位位数数。然然后后将将这这三三个个数数(百百、十十、个个)转转换换成成ASCII码。码。例例3-32 将一字节二进制
95、数转换成三位将一字节二进制数转换成三位ASCII码表示的十进制数。码表示的十进制数。 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例113CODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX (1)定义数据段,把需转换的数放入内存)定义数据段,把需转换的数放入内存BIN单元单元DATA SEGMENT BIN DB 01111111B ASDEC DB 3 DUP (?)DATA ENDS(2)、定义代码段,并初始化)、定义代码段,并初始化 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举
96、例114MOV DI,OFFSET ASDECMOV AL,BIN(3)取需转换的数送)取需转换的数送AL中中(4)求二进制数所含十进制数百位数的个数)求二进制数所含十进制数百位数的个数MOV BL,0 AGAIN1: SUB AL,100 JB NEXT1 INC BL JMP AGAIN1NEXT1: ADD AL,100 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例115 MOV AH,0AGAIN2: SUB AL,10 JB NEXT INC AH JMP AGAIN2NEXT: ADD AL,10 (4)求十位数的个数)求十位数的个数(5)把百、十、个位数转换为
97、)把百、十、个位数转换为ASCII码码ADD BL,30H ADD AH,30HADD AL,30H 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例116MOV DI,BLINC DIMOV DI,AHINC DIMOV DI,AL(6)把转换好的)把转换好的ASCII码送存储器中码送存储器中MOV AH,4CHINT 21HCODE ENDS END START(7)程序结束)程序结束 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例117 有有一一个个若若干干个个字字节节的的数数据据表表,存存放放在在数数据据段段中中,首首地地址址为为TAB,表表内内各各数
98、数已已按按升升序序排排列列好好。今今给给定定一一关关键键字字,试试编编程程从从表表内内查查找找该该关关键键字字,若若有有,则则结结束束;若若无无,将将该关键字顺序插入表中,并修改表长(表长在该关键字顺序插入表中,并修改表长(表长在LTH中)。中)。算法:算法:将将给给定定关关键键字字依依次次同同数数据据表表中中的的数数据据比比较较,若若大大于于表表中中的的数数据据,则则继继续续同同下下一一个个数数据据比比较较,若若小小于于表表中中数数据据,则则先先将将从从该该数数据据开开始始的的数数据据全全部部下下移移一一个个地地址址,然然后将关键字插入表中空格,并将表长数加后将关键字插入表中空格,并将表长数
99、加1。例例例例3-36 3-36 查找查找查找查找 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例118(1)在数据段中放置数据表及需查找的数据并计算表长)在数据段中放置数据表及需查找的数据并计算表长DATA SEGMENT TAB DB 0FH,12H,14H, TEM DB 57H LTH EQU TEM-TAB DATA ENDS(2)定义代码段并初始化)定义代码段并初始化CODESEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START:MOV AX,DATA MOV DS,AX MOV ES,AX 汇编语言程序举例汇编语言程序举例汇编语
100、言程序举例汇编语言程序举例119(3)循环初始化(取偏移地址、次数,取需查找的字)循环初始化(取偏移地址、次数,取需查找的字)MOV BX,OFFSET TAB MOV CX,LTHMOV AL,TEM(4)用循环程序实现查找关键字)用循环程序实现查找关键字 LOP: CMP AL,BX JE SOP JL INST INC BX LOOP LOP JMP JUST 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例120(4)把关键字插入表中(插入位置后的数据依次后移)把关键字插入表中(插入位置后的数据依次后移)INST:MOV DI,OFFSET TAB STD ADD DI,LTH MOV SI,DI DEC SI REP MOVSB(5)把关键字按顺序插入数据表中并修改表长)把关键字按顺序插入数据表中并修改表长JUST:MOV BX,AL INC LTH(6)程序结束)程序结束SOP: MOV AH,4CH INT 21HCODE ENDS END START 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例121 汇编语言程序举例汇编语言程序举例汇编语言程序举例汇编语言程序举例123