1、3.2 汇编语言程序设计汇编语言程序设计 n机器语言:计算机能直接理解并执行的二进制的代码,代码难以记忆,编程容易出错。每个CPU 都有特有的指令系统。n汇编语言:面向微处理器的指令语言,用指令助记符表示,便于书写记忆。实质是机器语言的符号表示,汇编语言与机器码对应。针对特定CPU、效率低,通用性差,用于实时控制和硬件接口。n高级语言:面向过程的语言,不依赖特定的机器,符合人们的思维习惯,通用性强,编译后的目标程序长,执行速度慢。3.2.1 汇编语言的基本元素汇编语言的基本元素 一、汇编语言的分段结构及汇编过程一、汇编语言的分段结构及汇编过程1、源程序结构、源程序结构 由几个逻辑段组成(段及大
2、小)由几个逻辑段组成(段及大小)以以END伪指令结束伪指令结束 逻辑段由语句序列组成(指令、伪指令、宏指令、注释,逻辑段由语句序列组成(指令、伪指令、宏指令、注释,空行)空行)除除CS段外,其他段寄存器用户设置段外,其他段寄存器用户设置 含有返回含有返回DOS的程序指令的程序指令NAME AHEXDATAS SEGMENT ;此处输入数据段代码此处输入数据段代码 DATAS ENDSSTACKS SEGMENT ;此处输入堆栈段代码此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,D
3、ATAS;段地址赋值;段地址赋值 MOV DS,AX MOV AX,STACKS;段地址赋值;段地址赋值 MOV SS,AX;;此处输入代码据核心代码;此处输入代码据核心代码 MOV AH,4CH;返回操作系统;返回操作系统 INT 21HCODES ENDS END START例:要求把例:要求把3个个16位的数相加,其和仍为位的数相加,其和仍为16位数。位数。NAME ADDHEXSTACK SEGMENTSTAPN DB 200 DUP(0);此处输入堆栈段代码此处输入堆栈段代码TOP EQU LENGTH STAPNSTACK ENDSDATA SEGMENTNUM1 DW 1234H
4、NUM2 DW 5678HNUM3 DW 0ABCDHANS DW?;此处输入数据段代码此处输入数据段代码 DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAS;段地址赋值;段地址赋值 MOV DS,AX MOV AX,STACK;段地址赋值;段地址赋值 MOV SS,AX MOV SP,TOP MOV AX,NUM1 ADD AX,NUM2 ADD AX,NUM3 MOV ANS,AX MOV AH,4CH;返回操作系统;返回操作系统 INT 21HCODE ENDS END START 例:求例:求1
5、开始的连续开始的连续50个奇数的和,存放在个奇数的和,存放在SUM中中DATAS SEGMENT SUM DW 0 ;此处输入数据段代码此处输入数据段代码 DATAS ENDSSTACKS SEGMENT DB 200DUP(0);此处输入堆栈段代码此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATAS;段地址赋值;段地址赋值 MOV DS,AX MOV CX,50;此处输入代码据核心代码此处输入代码据核心代码 MOV AX,0 MOV BX,1NEXT:ADD AX,BX I
6、NC BX INC BX DEC CX JNE NEXT MOV SUM,AX MOV AH,4CH;返回操作系统;返回操作系统 INT 21HCODES ENDS END START2、汇编过程n程序的编辑、汇编、连接二、汇编语言语句的类型和格式1、汇编语句种类n指令性语句:为8086的指令系统,与机器指令对应,是可执行的语句。n指示性语句:包括伪操作命令和伪操作符,不产生目标代码,是非执行指令,为汇编程序提供所需要的有关信息,仅在汇编过程中起作用。n宏指令语句:简化汇编源程序设计,用宏指令定义一段指令序列,汇编时将该指令序列取代宏指令。2、语句格式、语句格式由汇编语言编写的源程序是由许多语
7、句组成的。每个语由汇编语言编写的源程序是由许多语句组成的。每个语句由句由14个部分组成,个部分组成,每部分之间用空格每部分之间用空格(至少一个至少一个)分分开,开,其格式是:其格式是:。3 指令性语句说明n操作数:标号,界限符,常量,变量,表达式,寄存器。n常数操作数:数值常数,字符常数,数值符号名,数值表达式。n寄存器操作数:各种寄存器。n存储器操作数:标号,变量4、运算符和伪操作符运算符和伪操作符n1)运算符有算术运算符算术运算符、逻辑运算符逻辑运算符、关系关系运算符运算符算术运算符包括+、-、*、/、MOD、SHL(左移(左移一位相当于乘一位相当于乘2)、)、SHR(右移(右移1位相当于
8、除位相当于除2)例:例:数组ARRAY定义如下 ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 MOV AX,30*5 MOV CX,(,(TRY-ARRAY)逻辑运算符逻辑运算符n逻辑运算符包括AND、OR、NOT、XOR 4种n逻辑运算符时按位运算的,只能对常数运算,n得到的结果也是常数。例:例:MOV AL,NOT 0FFH MOV BL,8CH AND 73H MOV AH,8CH OR 73H MOV CH,8CH XOR 73H关系运算符关系运算符关系运算符包括EQ、NE、LT、GT、LE、GE 6种关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元
9、的地址。运算结果是一个数值,若结果为真,输出全是1,若结果为假,输出全0。例:例:MOV AX,10H GT 16 ADD BL,6 EQ 0110B SEGSEG取段址算符取段址算符取段址算符取段址算符功能功能:取变量或标号的段址 如:MOV AX,SEG BUF2)取值运算和属性操作取值运算和属性操作.分析运算分析运算分析运算分析运算符符符符.OFFSET.OFFSET取偏移地址算符取偏移地址算符取偏移地址算符取偏移地址算符功能功能:返回变量或标号的偏移地址 如:MOV SI,OFFSET BUF相当于指令 LEA SI,BUF.TYPE.TYPE取类型算符取类型算符取类型算符取类型算符功
10、功能能:返回变量的类型属性;返回标号的距离属性。变量类型为BYTE、WORD和DWORD时,返回的值分别为1、2和4;标号类型为NEAR或FAR时,则返回-1或-2。.LENGTH.LENGTH取变量所含存储单元的个数取变量所含存储单元的个数取变量所含存储单元的个数取变量所含存储单元的个数功能功能:分离出该变量所含存储单元的个数。注注意意:在在定定义义该该变变量量时时,数数据据定定义义伪伪指指令令后后面面的的第第一一个个表表达达式式的的形形式式为为“n n DUP(DUP(表表达式达式)”时,取值为时,取值为n n,否则为,否则为1 1。.SIZE.SIZE取变量所含存储区的总字节数。取变量所
11、含存储区的总字节数。取变量所含存储区的总字节数。取变量所含存储区的总字节数。功能功能:SIZE=LENGTH*TYPESIZE M1=200(因为TYPE M1=2)SIZE M2=2(因为TYPE M2=1)SIZE M3=1(因为TYPE M3=1).PTR.PTR格式格式:类型类型 PTR 表达式表达式类型类型:表达式表达式:是变量、标号或数值:是变量、标号或数值 变量的类型有:变量的类型有:BYTE、WORD和和DWORD;标号的类型有:标号的类型有:NEAR和和FAR;结构名称结构名称合成操作符合成操作符功功能能:PTR把它左边的属性指派给它右边的变量、标号或数值,使之产生一个新的存
12、储器地址操作数。如:(1)INC BYTE PTR BX (2)ADD DX,WORD PTR FOOB20 新存储器操作数的段地址和段内偏移量与PTR运算符右边的操作数的对应量相同。PTR给已分配的存储器一个另外的定义但并不重新分配存储器。例:例:N1 DB 15H,36H N2 DW 1122H,3344HLO:MOV AX,WORD PTR N1;使使N1类型转换成字与类型转换成字与AX类型匹配类型匹配 MOV BL,BYTE PTR N2 ;使使N2类型转换成字节与类型转换成字节与BL类型匹配类型匹配也可以用也可以用PTR来改变距离属性,如来改变距离属性,如:JMP FAR PTR L
13、O使使JMP安排在其他代码段中也可以使用,实现段间转移。安排在其他代码段中也可以使用,实现段间转移。.THIS.THIS操作符操作符操作符操作符格式:变量格式:变量/标号标号 EQU THIS 类型类型/距离距离功功能能:将EQU THIS右边的类型/距离属性,赋给左边的变量/标号,该变量或标号的段地址和偏移地址与下一存储单元的地址相同FIRST EQU THIS BYTETABLE DW 200 DUP(?)如:.SHORT.SHORT操作符操作符操作符操作符SHORT用于条件转移、转移和调用指令中,指出转移的目标地址和本指令之间的距离不超过一个字节所能表达的范围。.HIGH/LOW.HIG
14、H/LOW格式格式:HIGH/LOW 变量或标号变量或标号字节分离运算符,对一个数或地址表达式,字节分离运算符,对一个数或地址表达式,HIGH 从中分离出高位字节,从中分离出高位字节,LOW分离出分离出低位字节低位字节例:例:K1 EQU 0ABCDH K2 EQU 1234H MOV AH,HIGH K1 MOV BL,LOW K2n3)其他运算符其他运算符优先级3.2.2 3.2.2 伪指令语句伪指令语句指指令令语语句句:汇编程序把它们翻译成机器代码,命令8086执行对应操作。伪伪指指令令语语句句:汇编程序并不把它们翻译成机器代码,只是用来指示、引导汇编程序在汇编时做一些操作,它本身不占用
15、存储单元。*数据定义语句数据定义语句DB、DD等等*标号赋值语句标号赋值语句EQU,*段段定义语句定义语句SEGMENTENDS*段分配语句段分配语句ASSUME*过程定义语句过程定义语句PROCENDP*程序开始结束语句程序开始结束语句ORG,END伪指令主要分为下列几类:伪指令主要分为下列几类:一、数据定义语句一、数据定义语句一、数据定义语句一、数据定义语句DB、DW和DD等可用于定定义义变变量量和预预置置存存储储器器,变量后不能带冒号,任何变量均有下列三属性。(1)段属性即变量所使用的段;(2)段内偏移属性;(3)变量的类型:字节、字、双字等。DB/DW/DD/DQ/DT DB/DW/D
16、D/DQ/DT变量定义伪指令变量定义伪指令变量定义伪指令变量定义伪指令(1)格式:格式:变量名称变量名称 DB/DW/DD/DQ/DT表达式表达式功能功能:定义一数据存贮区。该数据存贮区的类类型型由所使用的数据定义伪指令指定(其中DB/DW/DD/DQ/DT定义的分别为字节型/字类型/双字型/四字/十个字节);存贮区中数据的个个数数由其后表达式的个数(包括重复因子)决定;并为各存储单元提供一个初值初值。(2)表现形式:表现形式:根据表达式的不同可有以下几种常见形式。根据表达式的不同可有以下几种常见形式。a.表达式为预置的一个常数项表达式表达式为预置的一个常数项表达式如:如:ABDBAB ;42
17、41HBADW AB ;4142HFENDW OFEH ;254SEG-FEHDW SEG FEN;变量;变量FEN的段址的段址PAR1DB74PAR2DW 1234H表达式存储的格式表达式存储的格式例:DA1 DB 10H,52H DA2 DW 1122H,34HDA3 DD 5*20H,0FFEEHDA1105222113400A00000EEFF0000DA2DA300例:表达式为字符串FIST DB HELLO SECOND DW OKTHREE DB OKFIST48454C4C4F4B4F4F4BSECONDTHREEHELLOOKOK注注意意:用用DB和和DW定定义义时时不不同同
18、的存放方式的存放方式b.表表达达式式中中出出现现“?”,表表示示只只分分配配存存储储单单元元,其初值不定。其初值不定。如:如:SUMDW?;分配一个字单元;分配一个字单元F1DB?;分配一个字节单元;分配一个字节单元c.表达式为预置地址表达式表达式为预置地址表达式(DW/DD)如如:TABLE-0FFDW TABLE ;TABLE的偏移量的偏移量D-PTR-T DD TABLE;TABLE的的16位偏移量和段址位偏移量和段址d.表达式为预置重复的算式。表达式为预置重复的算式。如:如:ZIPS DB 100 DUP(0)DB 2 DUP(0,3 DUP(1)二、表达式赋值语句二、表达式赋值语句二
19、、表达式赋值语句二、表达式赋值语句1.1.赋值语句赋值语句赋值语句赋值语句EQUEQU格式:符号名格式:符号名 EQU 数值表达式数值表达式功功能能:为常量、变量、表达式或其他符号定义一个名字,但不申请分配内存。如:THREE EQU 3 FIRSTW EQU WORD PTR BYT;把变量;BYT定义为名字是FIRSTW的字例:例:例:例:COUNT EQU 100 ;常数值赋给符号名;常数值赋给符号名COUNT DATA EQU COUNT+2 ;表达式值赋给符号名;表达式值赋给符号名DATA A1 EQU BX+SI ;变址寻址存储单元内容赋给符号名;变址寻址存储单元内容赋给符号名A1
20、 B1 EQU OFFSET A1 ;偏移地址值赋给符号名;偏移地址值赋给符号名B1 C1 EQU ADD ;加法指令赋给符号名;加法指令赋给符号名C1注:注:注:注:PURGEPURGE语句可以解除对某一个标号的赋值,使它在后面可以重新定义。语句可以解除对某一个标号的赋值,使它在后面可以重新定义。语句可以解除对某一个标号的赋值,使它在后面可以重新定义。语句可以解除对某一个标号的赋值,使它在后面可以重新定义。PURGE C1 PURGE C1 ;C1C1不再代替不再代替不再代替不再代替ADDADD2.2.等号语句等号语句等号语句等号语句=功功能能:等号语句“=”与EQU语句具有相同的功能,区别
21、仅在于EQU左边的标号不允许重新定义,而用“=”定义的语句允许重复定义。如:COUNT=100 COUNT=COUNT+1三、段定义语句三、段定义语句三、段定义语句三、段定义语句1.SEGMENT和ENDS定义方式:定义方式:段名 SEGMENT 定位类型 组合方式 分类名 语句 段名 ENDSSEGMENT与ENDS成对出现,不可省略。段名:段名:是逻辑段的标识符,不可省略,是逻辑段的标识符,不可省略,它确定了逻辑段在存储器中的地址。它确定了逻辑段在存储器中的地址。2.段分配语句(ASSUME)格式:格式:ASSUME CS:段名,:段名,DS:段名,:段名,SS:段名,:段名,ES:段名:
22、段名功能功能:定义4个逻辑段,指明段和段寄存器关系。注注:ASSUME只是建立当前定义的段名与段寄存器之间的联系,除除了了CS外外,不能将各个段的段地址装入相应的段寄存器中,DS、ES、SS的设置必须通过指令性语句来完成。四、过程定义语句四、过程定义语句四、过程定义语句四、过程定义语句其其其其中中中中过过过过程程程程名名名名是是是是为为为为该该该该过过过过程程程程指指指指定定定定的的的的一一一一个个个个名名名名称称称称,与变量、标号的定义法相同。与变量、标号的定义法相同。与变量、标号的定义法相同。与变量、标号的定义法相同。使用格式:过程名使用格式:过程名 PROC NEAR/FAR RET 过
23、程名过程名 ENDP功功能能:把把具具有有一一定定功功能能的的程程序序段段设设计计成成为为一一个个过过程程(子子程程序序),便便于于实实现现模模块块化化的的程程序设计。序设计。注注:(1)CALL指令中过程名起着标号的作用。有段属性、偏移量属性和类型属性(NEAR和FAR)。(2)子程序中至少有一个RET。MCODE SEGMENTMAIN SPD PROC FAR ;过程定义,远过程属性过程定义,远过程属性 RETSPD EDNP CALL SPD ;同一段内调用同一段内调用 MCODE ENDS例:过程的定义及调用格式NCODE SEGMENT CALL SPD ;远过程调用远过程调用 N
24、CODE ENDS END MAIN1.NAME1.NAME和和和和ENDEND伪指令伪指令伪指令伪指令功功能能:定义一个模块,作为一个独立的汇编单位,在输出汇编语言程序的列表文件时,将在每一页的开头打印出该程序名。若源程序中省略NAME,则将源文件名作为目标模块的名字。格式:格式:NAME 模块名模块名 END 标号标号五、程序开始和结束语句五、程序开始和结束语句五、程序开始和结束语句五、程序开始和结束语句注注:一一个个模模块块是是一一个个独独立立的的汇汇编编单单位位,汇汇编编处理只进行到模块结束语句处理只进行到模块结束语句ENDEND为止。为止。例:例:CODE SEGMENT START
25、:SUB1 PROC NEAR SUB1 ENDP CODE ENDS END START2.ORG格式:格式:ORG 表达式表达式功功能能:给汇编程序设置位置指针,指定下面语句的起始偏移地址。表表达达式式为为给给定定的的偏偏移移地地址址。一一般般情情况况下下,段段定定义义语语句句(SEGMENT)指指出出了了段段的的起起点点,偏偏移移地地址址为为0,段段内内各各语语句句或或数数据据的的地地址址由由段段地地址址开开始始依依次次类类推推可可确确定定。当当用用户户要要求求指定某条指令或数据为某个指定地址时,可用指定某条指令或数据为某个指定地址时,可用ORG来改变。来改变。例:用例:用ORG改变数据
26、段地址改变数据段地址DATA SEGEMENT ORG 100H A1 DB 10H,20H,30H ;A1偏移地址为偏移地址为100H ORG 200H A2 DW 3031H,3233H ;A1偏移地址为偏移地址为200HDATA ENDS六、六、宏指令宏指令 一般格式为一般格式为:宏指令名宏指令名 MACRO 形式参量表形式参量表 宏体宏体 ENDM 在汇编语言书写的源程序中,若有的程序段要在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令一条宏指令来代替,而汇编程序汇编到
27、该宏指令时,会产生源程序所需的代码。时,会产生源程序所需的代码。例如:例如:SHIFT MACRO MOV CL,4 SAL AL,Cl ENDM代码段:代码段:MOV AX,3H SHIFT MOV BX,6H代码段:代码段:MOV AX,3H MOV CL,4 SAL AL,Cl MOV BX,6H 外部伪指令外部伪指令外部伪指令外部伪指令程序包含多个模块时,有些程序或数据在各个模块间要相互共享,可用外部伪指令PUBLICPUBLICPUBLICPUBLIC和EXTRNEXTRNEXTRNEXTRN来实现此功能。注:符符号号必必须须用用“,”分分开开,且且均均在在本本模块中定义过。模块中定
28、义过。注:注:格式:格式:PUBLIC 符号表符号表功功能能:用来说明该模块中被定义的那些常常量量、变变量量和标标号号(含过程名)可以被其他模块所引用。如:PUBLIC ABC,BCD,CDE(1)PUBLIC伪指令格式:格式:EXTRN 符号:类型,符号:类型,功功能能:指出本模块中需要引用但却在其他模块中定义并说明为PUBLIC属性的符号(含常量,变量,标号和过程),符 号 的 类 型(BYTE、WORD、DWORD、NEAR、FAR和ABS(符号常量)必须与它们在其他模块中定义时的类型一致。(2)EXTRN伪指令3.2.3 汇编程序设计汇编程序设计程序设计的基本步骤n分析课题n确定算法n
29、画出流程图n存储器资源分配n编写程序n上机调试程序设计注意问题n程序模块化n程序正确完整n算法可靠合理n注重软件执行速率 顺序结构 分支选择结构 循环结构n一、顺序结构与简单程序设计一、顺序结构与简单程序设计n简单程序设计是没有分支,没有循环的直线运行简单程序设计是没有分支,没有循环的直线运行程序,程序执行按照程序,程序执行按照IP内容自动增加的顺序进行。内容自动增加的顺序进行。n例例1:编写计算:编写计算Z=(X*X-3*Y)/2的程序,的程序,设设X,Y为单字节整数,结果为单字节整数,结果Z为一个字。为一个字。DATA SEGMENTX DB 25Y DB 32Z DW?DATA ENDS
30、CODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AXMOV AL,XMUL ALMOV BX,0MOV BL,YADD BL,BLADC BH,0ADD BL,YADC BH,0SUB AX,BXSHR AX,1MOV Z,AXMOV AH,4CHINT 21HCODE ENDS END STARTn例例2 利用查表法计算平方值。已知利用查表法计算平方值。已知0 15的平方值连续存的平方值连续存在以在以TABL开始的存储区域中,求开始的存储区域中,求XD单元内容单元内容X的平方值,的平方值,并放在并放在YD单元中。假定单元
31、中。假定0X 15且为整数。且为整数。n分析:建立平方表,通过查表完成。分析:建立平方表,通过查表完成。nNAME MYPROGnDATA SEGMENTnTABL DB 0,1,4,9,16,25,36,49,64,81;n DB 100,121,144,169,225 ;015的平方的平方nXD DB 6nYD DB?nDATA ENDSnSTACKSEGMENTnSTA DB 100 DUP(?)(?)nTOP EQU LENGTH STAnSTACK ENDSnCODESEGMENTnASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOV
32、DS,AX ;为;为DS送初值送初值MOV AX,STACK MOV SS,AX MOV SP,TOP LEA BX,TABL;以下部分完成求平方值;以下部分完成求平方值MOV AH,0 ;亦可用查表指令完成;亦可用查表指令完成MOV AL,XD ;LEA BX,TABLADDBX,AX ;MOV AL,XDMOV AL,BX ;XLAT MOV YD,AL ;MOV YD,AL MOV AH,4CH ;MOV AX,WORD PTR XD INT 21H ;MOV AL,BYTE PTR XDCODEENDSEND STARTn例例3 已知已知 Z=(X+Y)-(W+Z),其中,其中X,Y,
33、Z,W均为用压缩均为用压缩BCD码表示的数,写出程序。码表示的数,写出程序。n分析:这也是一种典型的直线程序,在这里要注意是分析:这也是一种典型的直线程序,在这里要注意是BCD数相加,要进行十进制调整。具体程序如下:数相加,要进行十进制调整。具体程序如下:n MOV AL,ZnMOV BL,WnADDAL,BLnDAAnMOV BL,AL ;BL=(W+Z)nMOV AL,XnMOV DL,YnADDAL,DL ;AL=(X+Y)nDAA ;十进制调整;十进制调整nSUBAL,BL ;AL=(X+Y)-(Z+W)nDAS ;十进制调整;十进制调整nMOV Z,AL ;结果送;结果送Z 二、二、
34、分支程序设计分支程序设计n分支程序的基本思想是根据逻辑判断的结果来形成程序的分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,主要分为以下两种类型。分支,主要分为以下两种类型。n1、两路分支结构、两路分支结构n程序中使用一条条件判断语句就可以实现。程序中使用一条条件判断语句就可以实现。n例例4 比较存储单元中的两个比较存储单元中的两个8位无符号数,大者放在位无符号数,大者放在AL寄寄存器中,设偏移地址已在存器中,设偏移地址已在BX中。中。MOV AL,BXINC BXCMP AL,BXJAE BIGEREXCH:MOV AL,BXBIGER:n例例5 在数据区中,对数据块传送,源数据块在
35、数据区中,对数据块传送,源数据块BLOCK1,目,目的数据块的数据块BLOCK2,两者地址有重叠。要先判断源地址,两者地址有重叠。要先判断源地址+数据块长度是否小于目的地址,若是,则可按增量方式进数据块长度是否小于目的地址,若是,则可按增量方式进行,否则要修改指针指向数据块底部,采用减量方式传送行,否则要修改指针指向数据块底部,采用减量方式传送。nDATA SEGMENTnSTRG DB 1000 DUP(?)nBLOCK1 EQU STRG+5nBLOCK2 EQU STRG+10nBLENG EQU 100nDATA ENDSnCODE SEGMENTn ASSUME CS:CODE,DS
36、:DSTS,ES:DATAnSTART:MOV AX,DATAn MOV DS,AXn MOV ES,AXMOV CX,BLENGMOV SI,OFFSET BLOCK1MOV DI,OFFSET BLOCK2CLDPUSH SIADD SI,BLENG-1CMP SI,DIPOP SIJB GOSTDADD SI,BLENG-1ADD DI,BLENG-1nGO:REP MOVSBMOV AH,4CHINT 21HnCODE ENDSEND STARTn2 三路分支结构三路分支结构例例6 试编写程序段,实现符号函数。试编写程序段,实现符号函数。1 X0Y=0 X=0 (X的范围:的范围:-1
37、28+127)-1 X0 X给定值放在给定值放在DATX单元,函数值放在单元,函数值放在DATY单元。单元。符号函数可表示为程序可通过对符号标志的判别来确定执符号函数可表示为程序可通过对符号标志的判别来确定执行哪一分支。行哪一分支。NAME EXE_4DATA SEGMENTDATX DB -3DATY DB?DATA ENDSCODE SEMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,DATX CMP AL,0JGE BIGERMOV AL,0FFHMOV DATY,ALJMP NEXTBIGER:JE EQULM
38、OV AL,1MOV DATY,ALJMP NEXTEQUL:MOV DATY,ALNEXT:MOV AH,4CHINT 21HCODE ENDSEND STARTn3 多路分支程序多路分支程序n利用表实现分支利用表实现分支 n根据根据AL中各位被置位情况,控制转移到中各位被置位情况,控制转移到10个子程序个子程序R0R9之一中去。之一中去。n分析:对于这种程序关键要找出每种情况的转移地址,从分析:对于这种程序关键要找出每种情况的转移地址,从图中可见图中可见n表地址表地址=表基地址表基地址+偏移量偏移量,而偏移量可由而偏移量可由AL各位所在位置各位所在位置*2求得求得n表基地址放在表基地址放在
39、BX中中 例例7:设有:设有10种处理子程序,程序入口地址为种处理子程序,程序入口地址为R0-R9的内的内存区域中,根据键盘不同的输入值,试实现不同的分支跳存区域中,根据键盘不同的输入值,试实现不同的分支跳转。设转。设ADRTAB为表格的首址。为表格的首址。NAME EXE-5DATA SEGMENTADRTAB DW R0,R1,R2,R3,R4,R5,R6,R7 DW R8,R9TEN DB?DATA ENDSSTACK SEGMENTSTA DB 100DUP(?)(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART
40、:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,LENGTH STA MOV AH,01INT 21HCOMPUT:MOV AH,0AND AL,0FHADD AL,ALMOV BX,OFFSET ADRTABADD BX,AXMOV AX,BXJMP AXR0:R1:.R9:MOV AH,4CHINT 21HCODE ENDS END START三、三、循环程序设计循环程序设计1 循环程序结构循环程序结构n循环程序是经常遇到的程序结构,在对某一段程循环程序是经常遇到的程序结构,在对某一段程序多次执行时使用。序多次执行时使用。n例例8
41、计算计算1到到100的和,并把它放入的和,并把它放入SUM单元中。单元中。DATA SEGMENTSUM DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,START:MOV AX,DATA MOV DS,AX MOV AX,0 MOV CX,100AGAIN:ADD AX,CXDEC CXJNZ AGAINMOV SUM,AXMOV AH,4CHINT 21HCODE ENDS END STARTn一个循环结构通常由以下几个部分组成一个循环结构通常由以下几个部分组成。1 循环初始化部分。一般要进行地址指针、循环次数及某标志的设置,相关寄存器的清零
42、等操作。只有正确地进行了初始化设置循环程序才能正确运行,及时停止。2循环处理部分。是要求重复执行的程序段部分,对应于要求重复执行的操作。3循环控制部分。由该部分修改并判断控制循环的条件是否满足,以决定是否继续循环。有计数器控制和用特征条件判断来控制。4循环结束部分。如循环运行结果存储或输出等 2 循环程序的基本逻辑结构循环程序的基本逻辑结构n DOUNTIL结构:在执行循环结构:在执行循环体之后,再判断循环控制条件是体之后,再判断循环控制条件是否满足。循环程序的循环体至少否满足。循环程序的循环体至少必须执行一次。必须执行一次。n DOWHILE结构:循环控制部结构:循环控制部分在循环体的前面,
43、先判断执行分在循环体的前面,先判断执行循环体的条件,满足条件就执行循环体的条件,满足条件就执行循环体,否则就退出循环。其循循环体,否则就退出循环。其循环体有可能并不执行。环体有可能并不执行。n3 循环程序设计n例例 9 在内存的字单元在内存的字单元X中有中有一个一个16位的二进制数,统计位的二进制数,统计X单元中单元中1的个数,并将结果的个数,并将结果存入存入RESULT单元中单元中。n分析:这是一个循环统计的分析:这是一个循环统计的工作。采用工作。采用DOWHILE结结构,做构,做16次循环,每次将最次循环,每次将最高位移入高位移入CF中进行测试,先中进行测试,先判断结果是否为判断结果是否为
44、0,若为,若为0,则结束;否则统计计数后循则结束;否则统计计数后循环重复环重复。DATA SEGMENTX DW 31A0HRESULT DW?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,START:MOV AX,DATA MOV DS,AX MOV CX,0 MOV AX,X AGAIN:AND AX,AX JZ EXIT SHL AX,1 JNC NEXTINC CXNEXT:JMP AGAINEXIT:MOV RESULT,CXMOV AH,4CHINT 21HCODE ENDS END STARTn例例10 设内存设内存BLOCK开始的单元
45、中依次存放着开始的单元中依次存放着10个个16位符号数,求它们的和并放在位符号数,求它们的和并放在SUM单元中,单元中,试编写程序。试编写程序。n例例11 设内存设内存BUFF开始的单元中依次存放着开始的单元中依次存放着30个个8位无符位无符号数,求它们的和并放在号数,求它们的和并放在SUM单元中,试编写程序。单元中,试编写程序。LEA SI,BUFF ;设地址指针;设地址指针MOVCX,30 ;设计数初值;设计数初值XORAX,AX ;设累加器初值;设累加器初值AGAIN:ADDAL,SIADCAH,0INCSIDECCXJNZAGAIN ;循环累加;循环累加MOVSUM,AXn4 多重循环
46、多重循环n在实际应用中,有些问题较复杂,一重循环不够,在实际应用中,有些问题较复杂,一重循环不够,必须使用多重循环实现,这些循环是一层套一层必须使用多重循环实现,这些循环是一层套一层的,通常称为循环嵌套。的,通常称为循环嵌套。n例例13:在在DS所决定的数据段,从偏移地址所决定的数据段,从偏移地址ARRAY开始顺序存放开始顺序存放10个有符号个有符号16位数,现要编写程序位数,现要编写程序将这将这10个字数据从大到小排序。个字数据从大到小排序。n分析:排序的方法有很多,在这里,我们采用冒分析:排序的方法有很多,在这里,我们采用冒泡法。泡法。MOV BL,0FFH;标记有交换标记有交换A1:CM
47、P BL,0FFH JNE A4;无交换则结束;无交换则结束XOR BL,BL;BL清零清零MOV CX,COUNT-1XOR SI,SI;SI清零清零A2:MOV AX,ARRAYSICMP AX,ARRAYSI+2JGE A3;大等于转;大等于转XCHG ARRAYSI+2,AXMOV ARRAYSI,AXMOV BL,0FFHA3:INC SIINC SILOOP A2JMP A1A4:四、四、子程序设计子程序设计n子程序是程序设计中经常使用的程序结构,通过子程序是程序设计中经常使用的程序结构,通过把一些固定的、经常使用的功能做成子程序的形把一些固定的、经常使用的功能做成子程序的形式,可
48、以使源程序及目标程序大大缩短,提高程式,可以使源程序及目标程序大大缩短,提高程序设计的效率和可靠性。序设计的效率和可靠性。n对于一个子程序,应该注意它的入口参数和出口对于一个子程序,应该注意它的入口参数和出口参数。入口参数是由主程序传给子程序的参数,参数。入口参数是由主程序传给子程序的参数,而出口参数是子程序运算完传给主程序的结果。而出口参数是子程序运算完传给主程序的结果。另外,子程序所使用的寄存器和存储单元往往需另外,子程序所使用的寄存器和存储单元往往需要保护,以免影响返回后主程序的运行。要保护,以免影响返回后主程序的运行。n主程序在调用子程序时,一方面初始数据要传给主程序在调用子程序时,一
49、方面初始数据要传给子程序,另一方面子程序运行结果要传给主程序,子程序,另一方面子程序运行结果要传给主程序,因此,主子程序之间的参数传递是非常重要的。因此,主子程序之间的参数传递是非常重要的。n参数传递一般有三种方法实现。参数传递一般有三种方法实现。(1)利用寄存器。这是一种最常见方法,把所需传递利用寄存器。这是一种最常见方法,把所需传递的参数直接放在主程序的寄存器中传递给子程序。的参数直接放在主程序的寄存器中传递给子程序。(2)利用存储单元。这种参数传递方法,把所需传递利用存储单元。这种参数传递方法,把所需传递的参数直接放在子程序调用指令代码之后。的参数直接放在子程序调用指令代码之后。(3)利
50、用堆栈。这种方法将参数压入堆栈,在子程序利用堆栈。这种方法将参数压入堆栈,在子程序运行时从堆栈中取参数。运行时从堆栈中取参数。n例例:6个单字节数相加。个单字节数相加。n分析:将分析:将6个字节相加的程序段设计为子程序。个字节相加的程序段设计为子程序。主程序分主程序分2次调用该子程序,但每次调用的参数次调用该子程序,但每次调用的参数不同。不同。DATASEGMENTADD1 DBFEH,86H,7CH,35H,68H,77HADD2 DB45H,BCH,7DH,6AH,87H,90HSUMDB 2 DUP(0)COUNTDB2DATAENDSSTACKSEGMENTSTTDB100DUP(?)