《8086_PENTIUM指令系统(5)汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《8086_PENTIUM指令系统(5)汇编语言程序设计.ppt(80页珍藏版)》请在三一办公上搜索。
1、1,3.3 汇编语言中的标记、表达式和伪指令,3.3.1 汇编语言概况,图3.8 由汇编程序执行的汇编过程,2,汇编语言用指令助记符来表示机器语言。汇编语言编写的程序源程序。汇编语言中的指令与机器指令之间具有一一对应的关系。经过汇编后,得到目标代码。汇编语言是面向机器的语言。它的优点直接面向机器,硬件操作能力强,目标代码小,执行效率高。缺点:与其它高级语言相比较,程序阅读、理解相对困难,可移植性差。下面看一段汇编语言程序例子,3,DATASEGMENT;数据段定义开始 DAI DBINPUT STRING:$BUFDMADB80HDUP(?)DATAENDS;数据段定义结束STACKSEGME
2、NT;堆栈段定义开始 ME1DB80HDUP(?)STACKENDS;堆栈段定义结束CODESEGMENT;代码段定义开始ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSET MEIMOVAH,09HINT21HMOVDX,OFFSET BUFDMA MOVAH,0AHINT21HCODEENDS;代码段定义结束END;程序结束,规范程序,4,3.3.2 汇编语言中的标记,汇编语言是面向机器的程序设计语言。汇编语言程序设计在计算机的程序设计中占据重要的地位,特别是对于自动化专业更是如此。汇编语言程
3、序的最大优点:直接面对计算机的硬件,可以直接操作计算机的全部资源,具有最高的效率和控制硬件的能力。最主要缺点:面向特定的计算机,不方便程序移植,需要熟悉硬件。,5,1 汇编语言指令的书写格式及标识符,(1)指令书写格式标号:指令助记符 操作数,(操作数);注释(2)标号:又叫标识符。为可选项,它在指令助记符前,以“:”结尾。标号是该指令在内存中存放的符号地址,转移指令,过程调用指令通常使用该标号来作为目的地址。一个程序段的开头、一个数据段的开头一般会给出标识符。子程序投、转移程序的转移目的需要给出标识符。,6,标号由英文字母、数字、或“_,?”等组成,但应注意:第一个符号不能是数字;“?”不能
4、单独做标号。保留字不能作为标号使用。所谓保留字,就是所有的指令,伪指令以及汇编语言定义的特殊符号,例如 LJMP DB 等。标号不是每一条指令都必须的,只有需要时,指令前面才加标号。所谓需要,就是转移指令的目的地址,或过程(子程序)的第一条指令,或其它目的。标号的长度:不超过31位。,7,标号由英文字母、数字、或“_,?”等组成,但应注意:第一个符号不能是数字;“?”不能单独做标号。保留字不能作为标号使用。所谓保留字,就是所有的指令,伪指令以及汇编语言定义的特殊符号,例如 LJMP DB 等。标号不是每一条指令都必须的,只有需要时,指令前面才加标号。所谓需要,就是转移指令的目的地址,或过程(子
5、程序)的第一条指令,或其它目的。标号的长度:不超过31位。,8,例如:START MY_CODE X ABCD1?001 L004 ABC都是有效的标号,9,而以下这些标号 4ABC 第一个字符是数字 MAIN$使用了非法字符$STR=6 使用了非法字符=A/B 使用了非法字符/?问号不能单独作标号使用 MOV 使用了保留字 MOV 都是无效的标号。保留字是指整个字符串,如果字符串中只有部分字符与保留字相同则没关系例如:A_MOV_B AND123等,都是有效标号。,10,(3)指令助记符和操作数,前面学过。,11,(4)注释,是可选项,它主要是为了增加程序的可读与可理解性,注释部分不影响程序
6、的执行。注释部分以“;”号开始,可以使用任何符号。一行写不下,可以使用多行,凡是“;”后面的,都是注释。注释放在一段程序之前,对这段程序进行说明。或者放在指令之后,对这条指令执行的作用进行说明。,12,DATA SEGMENT;数据段定义开始DA1DB This is a sample program DB 0DH,0AH,$DATA EMDS;数据段定义结束 STACK SEGMENT;堆栈段定义开始 ST1 DB 100DUB(?);定义100个字节 STACK ENDS DATA SEGMENT;数据段定义开始DA1DB This is a sample program DB 0DH,0
7、AH,$DATA EMDS;数据段定义结束,13,STACK SEGMENT;堆栈段定义开始 ST1 DB 100DUB(?);定义100个字节堆栈空间 STACK ENDSCODE SEGMENT;代码段定义开始MAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACKORG 1000 START:PUSH DS;程序代码开始 MOV AX,0 MAIN EMDP;代码结束 CODE ENDS;代码段定义结束 END START;程序结束,14,2 保留字,汇编语言中用到的,不能给用户随意定义为其它功能的字符和字符串。例如:全部的指令助记符,寄存器名 伪指令符
8、号 表达式符号等。,15,3.分界符,汇编语言程序设计中,作为程序,或一条指令中两个部分的分隔符用。例如 两个操作数之间的分隔符,标号的分隔符 注释的分隔符教材124页表3.2 给出了可用的分界符。,16,4.常数,在指令中,它就是立即数。可以使用各种数制,注意不同数制的表示方式。如果是字符串,需要用单引号括起来,例如ABCD它表示包含4个字符的字符转,分别用每个字符的ASCII码存放41H,42H,43H,44H1234表示的是字符串,存放31H,32H,33H,34H,17,3.3.3 表达式,1.表达式的组成:操作数和运算符。2.操作数:可以代表一个数据,也可以代表一个地址。逻辑运算符关
9、系运算符分析运算符综合运算符,18,3.运算符,(1)算术运算符包括+;-;*;/;取模运算 MOD取模运算 MOD两数相除,取它的余数。例如:20 MOD 7 结果为?6 55 MOD 6=1,19,(2)逻辑运算符,包括:与(AND);或(OR),非(NOT),异或(XOR)注:只能对常数进行,结果也是常数 他与指令的逻辑运算有区别该运算符在汇编时进行计算,而指令实在程序执行过程中进行运算。例如 AND DX,PORT AND 0FEH,逻辑表达式,汇编时计算出结果,逻辑指令,程序执行时起作用,20,3 关系运算符,两个操作数的关系相等 EQ,不等 NE,小于 LT,大于 GT,小于或等于
10、 LE,大于或等于GE。参与运算的两个操作数必须都是数据,或者是同一段存储单元的地址;结果是数据,关系成立,结果等于 0FFFFH,或0FFFF FFFFH如果关系不成立,结果等于 0例如:MOV BX,PORT LT 3如果确实 PORT 3,则汇编后,得到的代码相当于指令MOV BX,0FFFFH,21,反之,如果关系不成立,汇编后的机器代码相当于MOV BX,0关系运算符往往和逻辑运算符组合使用。例如MOV BX,(PORT LT 5)AND 20)OR(PORT GE 5)AND 30)如果是 32位寄存器,结果0,或 0FFFF FFFFH,22,4.分析运算符,将存储单元的地址分解
11、为段码和偏移值。OFFSET取偏移地址例如 MOV DX,OFFSET DAT SEG取存储单元的段码(段基址)例如:MOV AX,SEG ABC MOV DS,AXTYPESIZE LENGTH,23,5.综合运算符,主要要求掌握 PTR与BYTE,WORD,DWORD合用,定义存储单元的类型。MOV BYTE PRT 1000,12HMOV WORD PTR 1000H,12H,24,3.3.4 语句,汇编语言程序有一系列语句有序构成。两种语句指令性语句就是一条指令。例如MOV AX,1234HADD AX,BX 指示性语句不产生机器指令代码的语句,又叫伪指令语句。ABC DB 50H,3
12、5HSEGMENT CODE 等,25,它们的区别:指令性语句对应着一条机器指令,汇编后会产生对应的机器指令代码指示性语句只为汇编过程提供某些信息,让汇编程序在汇编过程中执行某些特定的功能。指示性语句使用标号时,标号后不用冒号分隔符。最本质的区别:是否产生目标代码。,26,3.3.5 伪指令,最常用的伪指令有:CPU定义.586/.586 P标号赋值 EQU;定义存储单元 DB、DW、DD、DQ、DT;定义存储类型 BYTE、WORD、DWORD;段定义位指令SEGMENT、ENDS、ASSUME和ORG;简约段定义位指令 DATA、STACK、CODE过程定义 PROC、ENDP、NEAR、
13、FAR;程序结束 END,27,默认为8086,如果不是,则需要定义。例如.386.586.586 P,1.确定CPU的伪指令,28,2.标号赋值伪指令EQU,定义标号或符号常数比如:ABC EQU 220XYZ EQU ABC程序设计中,对一些端口,或常数,一般会定义一个符号常数,然后再源程序设计中使用符号常数。例如 COM1 EQU 3F8H COM2 EQU 2F8H LPT EQU 378H,29,DB、DW、DD、DQ、DT比如:CR DB0DHLF DB0AHBUF_DIS DB?DO_2 DB 9 DUP(?)DONT DW10 DUP(?)TABLE DB00,01,03,02
14、,06,04,05,07 DB 0FH,0EH,0CH,0DH,09 DB 0BH,0AH,08比如:COUNT1 DT?相当于语句COUNT1 DB 10 DUP(?),3.定义存储单元的伪指令,30,4 定义存储单元类型的伪指令,BYTE、WORD和DWORD比如:MOV BYTE PTR DI,00MOV WORD PTR 1000,00INC BYTE PTR DIMOV DWORD PTR 2000,0FFFFFFFFH,注意:最高位大于9,补一个0,教材上129页的例,有错误,31,5 段定义伪指令,(1)SEGMENT、ENDS将汇编语言源程序分为若干段代码段,堆栈段、数据段(2
15、)ASSUME 定义段寄存器 ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA(3)ORG定义目标代码的偏移地址。ORG 2000HSEGMENT CODE ENDS,ORG 后面的代码从 CS:2000H开始。,32,5 简约段定义,简化的段定义伪指令.DATA/.STACK/.CODE.MODEL SMALL.586.DATAM1DW 00FFHM2DW00FFHP1DW?P2DW?.STACKSTDB100DUP(?).CODESTART:MOVAX,DATAMOVDS,AX,33,MOVAX,TOPMOVSP,AXMOVBX,OFFSET M1MOVAX,
16、BXMOVDX,00MOVBX,OFFSET M2MUL BXMOVBX,OFFSET P1MOV BX,AXMOVBX,OFFSET P2MOV BX,DXHLTENDSTART,34,6.过程定义伪指令,PROC/ENDP NEAR FAR例子:BCD码相加的程序段。.MODEL SMALL.586.DATAFIRSTDB 11,22,33,44SECONDDB 55,66,77,88SUMDB20 DUP(?).STACKSTADB20 DUP(?).CODESTART:MOVAX,DATAMOVDS,AX,35,MOVAX,TOPMOVSP,AXMOVSI,OFFSETFIRSTMOV
17、DI,OFFSETSUMMOVBX,OFFSETSECONDMOVCX,04CLDCLCADITI:CALLAAALOOPADITIAAAPROCNEARLODSBADCAL,BXDAASTOSBINCBXRETAAAENDPENDSTART,36,7.源程序结束伪指令,END或 END 表达式表达式就是程序第一条语句前面的标号。例如前面的程序ENDSTART,37,3.4 程序设计的基本步骤,分析问题,形成与解决问题对应的数学模型根据数学模型,确定所使用的算法根据算法绘制程序流程图根据流程图编写程序调试程序,38,3.4.1 流程图的画法,1 流程图的基本符号 程序的开始与结束符号框,程序的
18、处理过程符号框,39,判断符号框,表示程序执行方向的有向线段,当一张图画不下时,使用连接符号连接两张图或一张图的两个部分,符号,40,位于不同位置并顺序连接的两个连接符号具有相同的编号。编号可以用数字,也可以用字符串。,有这些基本符号,就可以画出程序流程框图。还有一些其它的符号,我们不要求,需要时查相关资料。,41,一个流程图实例,42,43,2 流程图的画法,(1)依据算法,将一个问题分解为一系列的计算、或判断步骤,用图框符号表示每一步的处理、或判断过程;(2)按照算法顺序,用有向线段将这些图框符号表示的处理过程连接起来,箭头表示的是处理过程的执行方向。(3)对于判断框,在它的分支出标出条件
19、:用Y 表示判断结果为“是”执行该分支,“N”表示判断结果为非执行;(4)对于转移目标,一般应该给出一个符号,作为编写程序代码是的转移符号地址(标号)。,44,4.4.2 程序的基本结构,最基本的程序结构:顺序结构、分支结构、循环结构。,子程序、中断服务程序是一种特殊的程序,它们也是由以上三种基本结构构成的。,45,3.4.3 简单程序设计,简单程序就是不存在转移类指令的程序,程序的执行过程没有转移,严格按照先后顺序,中间没有分支、循环、也不存在子程序的调用。例:将存储器单元DAT1中保存的一个组合BCD数转换成两个对应ASCII码值,并存入DAT2开始的两个单元,低位在前,高位在后。,46,
20、BCD码转换成ASCII码数据:非压缩BCD数据在高半字节+3.例如数字55:0000 0101 0011 0101,得到的结果是相同的。都是在高半字节加3。,47,该问题算法就很简单:从DAT1取出BCD数据,先将高4位清“0”,与30H相加或进行逻辑或,存入DAT2,再取出数据,将数据逻辑右移4位(高位BCD数移到低4位,高4位变“0”,再与30H相加(或进行逻辑或),存入DAT2+1单元。程序流程图:,48,程序流程图,程序代码,DATA SEGMENT DAT1 DB 34HDAT2 DB?,?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTA
21、RA:MOV AX,DATA MOV DS,AX;送段地址 LEA SI,DAT1 LEA DI,DAT2 MOV AL,SI AND AL,0FH ADD AL,30H MOV DI,AL MOV AL,SI,显示:MOV DL,ALMOV AH,02HINT 21H,49,MOV CL,4 SHR AL,CL ORL AL,30H MOV DI+1,AL MOV AH,4CH INT 21H CODE ENDS END START,如果要送到屏幕显示,则将转换结果先送DL,02送AH,调用DOS功能。类似前面的程序。,显示:MOV DL,ALMOV AH,02HINT 21H,AH=4CH
22、功能调用。功能是结束本程序,返回DOS,50,再看一个顺序程序:编写一个计算Z=(x2-3y)/2的程序,x,y为单字节正整数,Z用2字节保存。这是一个算术运算程序,算法设计:首先计算 X2=X*X,暂存该结果,其次计算 3*y,第三步计算 X2-3*y第四步计算(x2-3y)/2。该步使用算术右移实现除2运算,比用除法指令执行速度快。依据该算法,可以画出程序流程框图。,51,X2的计算,可以分解为,3*Y的计算,可以分解为,52,;数据段定义DATA SEGMENTXDB 25YDB 32ZDW?DATA ENDS;代码段开始CODE SEGMENTASSUME CS:CODE,DS:DAT
23、A EXPRE PROC FAR;过程定义START:PUSH DS;DS:00保存的是一条返回 SUB AX,AX;DOS 指令。PUSH AX;这里,将返回DOS的地址;压入堆栈 MOV AX,DATA,53,MOV DS,AX;数据段首地址(基地址)MOV AL,X MOV BL,ALMUL BL;X*X=X2MOV BX,AX MOV AL,Y;YMOV AX,0 MOV CX,AXADD AX,CX;2YADD AX,CX;3YXCHG AX,BX SUB AX,BX;X2-3YSHR AX,1;右移一位/2MOV Z,AXRET EXPRE ENDP;过程定义结束 CODE END
24、SEND START,RET 指令,转到DS:00,对于EXE格式程序,它是一条返回DOS的指令。,54,;数据段定义DATA SEGMENTXDB 25YDB 32ZDW?DATA ENDS;代码段开始CODE SEGMENTASSUME CS:CODE,DS:DATA MOV AX,DATAMOV DS,AXMOV AL,XMOV BL,AL,可以使用常规返回DOS方法 INT 21H的4CH功能调用,55,MUL BL;X*X=X2MOV BX,AX MOV AL,Y;YMOV AX,0 MOV CX,AXADD AX,CX;2YADD AX,CX;3YXCHG AX,BX SUB AX
25、,BX;X2-3YSHR AX,1;右移一位/2MOV Z,AXMOV AH,4CHINT 21HEXPRE ENDP;过程定义结束 CODE ENDSEND START,用INT 21 的4CH号功能调用返回DOS。,56,顺序程序的结构简单,但实际程序设计中,往往需要对某些条件进行判断,依据不同的条件执行不同的分支,这样,顺序程序将不能满足要求。,57,3.4.4 分支程序的设计,就是利用CPU的条件转移指令,通过判断某个标志为的状态,控制程序的执行过程。,58,二分支结构,分支结构,判断,B,N,Y,ABC1,ABC2,59,多分支结构,条件判断,Y,条件1,程序1,程序2,程序n,N,
26、程序n+1,60,我们还是通过实例来讨论。例:内存单元M有一个16位的带符号数,求它的绝对值,并将结果放回原处。算法:求一个数的绝对值时,如果是正数,绝对值不变,如果是负数,则求它的机器负数(连同符号位一起每位取反,最低位+1,就是使用NEG指令)。有了算法,可以画出程序流程图。,61,62,DATA2 SEGMENT M DW?DATA2 ENDSCODE2 SEGMENT ASSUME CS:CODE2,DS:DATA2START:MOV AX,DATA2 MOV DS,AX LEA SI,M;MOV SI,OFFSET M MOV AX,SI ORL AX,AX;AND AX,AX JN
27、S DONEN_NUMB:NEG AX DONE:MOV SI,AX MOV AH,4CH INT 21H CODE2 ENDS END STARA,63,多分支程序,对分支程序,可以有这种2分支程序构成。,64,计算函数的程序,算法分析:取出数据X,判断它的符号,首先判断是否=0,如果不是,则是负数,Y=-1,如果是,还须再次判断是否等于0。程序流程框图为:,65,66,DATA3 SEGMENT X DW-8 Y DB?DATA3 ENDSCODE3 SEGMENT ASSUME CS:CODE3,DS:DATA3START:MOV AX,DATA3;设置段基址 MOV DS,AXLEA
28、SI,X;取偏移地址MOV AX,SIAND AX,AX,67,JNS LP1;SF=0,转到LP1LP0:MOV Y,0FFH;-1的补码JMP END1LP1:JZ LP3;X=0,转到LP3LP2:MOV Y,01H;X0,y=1LJMP END1LP3:MOV Y,00H;X=0,Y=0END1:MOV AH,4CHINT 21H CODE3 ENDSEND START,68,3.4.5 循环程序,循环程序的基本结构:,循环程序由5个基本部分构成:初始化、循环体、循环参数修改、循环控制、结束处理。循环程序有两种基本结构。,69,循环程序的另一种结构如图它的特点是先进性循环控制,判断是否
29、满足循环结束条件,如果满足,则结束循环。两种结构的区别在于判断循环结束条件的位置不同。第一种方法,循环体至少被执行一次。第二种可能不被执行。,例如求200个数据的绝对值,可以使用循环程序。,70,71,DATA SEGMENT DAT1 DB 200 DUP?DAT2 DB 200 DUP?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEASI,DAT1;(SI)源地址指针 LEA DI,DAT2;(DI)目标地址指针 MOV CX,200;(CX)循环次数,72,CHECK:MOVAL,SI;
30、取一个带符号数到ALORAL,AL;AL内容不变,但使之影响标志JNSNEXT;若(SF)=0,则转NEXTNEG AL;否则求补NEXT:MOV DI,AL;传送到目标地址INC SI;源地址加1INC DI;目标地址加1DEC CX;循环次数(CX)-1JNZ CHECK;如不等于零,则转CHECKMOV AH,4CHINT 21H;结束,返回DOS CODE ENDS END START,可以LOOP指令LOOP CHECK,73,74,DATA SEGMENT DAT1 DB 200 DUP?DAT2 DB 200 DUP?DATA ENDSCODE SEGMENT ASSUME CS
31、:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEASI,DAT1;(SI)源地址指针 LEA DI,DAT2;(DI)目标地址指针 MOV CX,200;(CX)循环次数,75,CHECK:MOVAL,SI;取一个带符号数到ALORAL,AL;AL内容不变,但使之影响标志JNSNEXT;若(SF)=0,则转NEXTNEG AL;否则求补NEXT:MOV DI,AL;传送到目标地址INC SI;源地址加1INC DI;目标地址加1LOOP CHECK;循环次数(CX)-1;如不等于零,则转CHECKMOV AH,4CHINT 21H;结束,返回DOS COD
32、E ENDS END START,76,循环程序的5个部分并不是一定必需的,但循环体和循环控制着两个部分是不能缺少的。一个循环程序,它的循环体如果只包含顺序程序和分支程序,则这样的循环结构为单重循环结构。前面的例子就是单重循环程序结构。,77,如果循环体内还包含一个循环结构,形成内层循环和外层循环,内层循环嵌套在外层循环体中叫做双重循环结构。,78,内循环结束,79,类似,还可以构成多重循环结构。循环控制除了计数方式外,还可以使用条件控制方法。例如测试某个条件来控制循环。,自动控制中经常用到这种结构,它与前面的控制方式有点区别,但他也是循环程序结构。,80,循环程序设计,循环体是基本部分,由它完成程序的主要功能。第二是循环控制,它包括是选择非0次循环结构还是0次循环控制结构;,