《3.5程序设计 高级汇编技术 待修改(精品).ppt》由会员分享,可在线阅读,更多相关《3.5程序设计 高级汇编技术 待修改(精品).ppt(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、3.5 汇编语言程序设计汇编语言程序设计指令或语句就是告诉计算机为完成某一计算步骤指令或语句就是告诉计算机为完成某一计算步骤需要执行的操作。程序是为了求解某个问题所必需要执行的操作。程序是为了求解某个问题所必须的完整的指令序列或语句串加上必要的数据。须的完整的指令序列或语句串加上必要的数据。程序设计是编写程序的过程程序设计是编写程序的过程。当在设计一个程序时,应该考虑满足以下目标:当在设计一个程序时,应该考虑满足以下目标:1)程序的正确性。)程序的正确性。2)增强程序的可读性。)增强程序的可读性。3)所写程序应该是结构化的,易修改,易调试,)所写程序应该是结构化的,易修改,易调试,即程序的可维
2、护性。即程序的可维护性。2程序的基本结构程序的基本结构 程序是指令(语句)的有序集合,是对系统任务处理步骤的描述。程程序是指令(语句)的有序集合,是对系统任务处理步骤的描述。程序的执行是有一定顺序的,依据执行顺序可将程序分为如下基本结构:序的执行是有一定顺序的,依据执行顺序可将程序分为如下基本结构:顺序结构、顺序结构、分支(选择)结构、分支(选择)结构、循环结构和循环结构和 子程序结构。子程序结构。(1)顺序结构:按语句先后次序执行一系列顺序操作。(2)分支结构:也叫条件选择结构,根据不同情况做出判断和选择,以便执行不同的程序段。(3)循环结构:循环实际上是分支结构的一种扩展,循环是否继续是依
3、靠条件判断语句来完成的。按照条件判断的位置,可以把循环分为“当型循环”和“直到型循环”。每个结构只有一个入口和出口,每个结构只有一个入口和出口,3种结构可以任意组合和嵌种结构可以任意组合和嵌套构成结构化的程序套构成结构化的程序。3 3.5.1 顺序结构程序设计顺序结构程序设计l顺序结构程序从执行开始到最后一条指令为止,指令指针IP中的内容呈线性增加;l设计这种程序只要遵照算法步骤依次写出相应的指令即可。l顺序结构程序设计时,主要考虑如何选择简单有效的算法,如何选择存储单元和工作单元。4 例例 从键盘输入一个小写英文字母,将其转换成大写英文从键盘输入一个小写英文字母,将其转换成大写英文字母后在屏
4、幕上显示出来。字母后在屏幕上显示出来。分析:利用DOS功能调用INT 21H指令实现。键盘输入一个字符可用01H调用,屏幕上显示字符可用02H调用。从ASCII码表中可知,将小写字母转换成大写字母只要将其ASCII码减去32即可。为简化程序设计,假设从键盘输入的字符一定是小写字母。5STACK SEGMENT STACK;定义堆栈段;定义堆栈段 DB 100 DUP(?);开辟;开辟100个存储单元个存储单元STACK ENDS;堆栈段结束;堆栈段结束CODE SEGMENT;定义代码段;定义代码段 ASSUME CS:CODE,SS:STACKSTART:MOV AH,01H ;1号调用,从
5、键盘输入一字符存入号调用,从键盘输入一字符存入AL INT 21H SUB AL,20H ;将;将AL中字符的中字符的ASCII码减去码减去20H变成大写字母变成大写字母 MOV DL,AL;结果送;结果送DL MOV AH,02H ;2号调用,在屏幕上显示号调用,在屏幕上显示DL中的内容中的内容 INT 21H MOV AH,4CH;返回;返回DOS INT 21H CODE ENDS;代码段结束;代码段结束 END START;程序汇编结束;程序汇编结束 注意注意:复制时候复制时候 标点符号修改,英文输入法标点符号修改,英文输入法6 3.5.2 分支结构程序设计分支结构程序设计 分支程序的
6、结构可以有两种形式:l双分支结构l多分支结构 【例】已知在内存中有一个字节单元X,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。分析:根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个负数的绝对值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数。8086指令系统中有专门的求相反数的指令NEG。源程序设计如下:DATASEGMENT X DB -25;定;定义变义变量量 RESULT DB?;定;定义结义结果保存果保存单单元元DATAENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART:MOV AX,DATA
7、MOV DS,AX ;初始化;初始化DS MOV AL,X ;X取到取到AL中中 TESTAL,80H ;测试测试AL正正负负 JZ NEXT ;为为正,正,转转NEXT NEG AL ;否;否则则AL求求补补NEXT:MOV RESULT,AL ;送;送结结果果 MOV AH,4CH INT 21H ;返回;返回DOSCODE ENDS END START ;汇编结汇编结束束9 【例】设变量X为带符号整数,试编写一个程序,完成下面的分段函数计算:题目分析:为实现分段函数计算,先利用上一个例题求出X的绝对值,然后根据X绝对值判断Y取值。程序段如下。AL送Y单元1-X送AL0送AL AL大于等于
8、5开始将X取到AL中AL中的内容求绝对值结束10DATASEGMENT X DB-36 Y DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE;DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,0 JGE NEXT ;为为正,正,转转NEXT NEG AL ;AL中的内容求中的内容求补补NEXT:CMP AL,5 ;|X|和和5比比较较 JGE P1 ;5,转转P1 MOV AL,1 ;否;否则则1送送AL MOV BL,X ;X送送BL中中 SUB AL,BL;结结果送果送AL中中 JMP EXIT ;转转EXI
9、TP1:MOV AL,0 ;0送送AL中中EXIT:MOV Y,AL ;结结果送果送Y单单元元 MOV AH,4CH INT 21H ;返回;返回DOSCODE ENDS END START ;汇编结汇编结束束 【例】设计一个程序,统计在内存W单元保存的无符号字变量中有多少个二进制“1”,统计结果送内存N单元保存。分析:要统计内存W单元保存的无符号字变量中有多少个二进制“1”,可以将该数据送寄存器AX中,通过移位指令将AX中的每一位依次移入进位标志CF中,若CF=1则计数器CL的值加1,这样就可以统计出AX中1的个数。设计源程序如下:。DATA SEGMENT W DW 00FFH;定义字数据
10、 N DB?;定义结果保存单元DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA;初始化DS MOV DS,AX MOV CL,0;计数器清零 MOV AX,W;取数到AX AA:AND AX,AX;逻辑与,判AX=0?JZ CC;结果为0转移到CC SHL AX,1;逻辑左移1位 JNC BB;无进位转BB INC CL;有“1”则计数 BB:JMP AA;无条件转AA CC:MOV N,CL;结果送N单元 MOV AH,4CH;返回DOS INT 21HCODE ENDS END START;汇编结束 13 3.5.3
11、 循环结构程序设计循环结构程序设计 1.循环程序的基本组成循环程序的基本组成循环结构程序主要由以下4个部分组成:(1)初始化部分(2)循环体(3)参数修改部分(4)循环控制部分142.单循环程序设计单循环程序设计【例】编程完成求150之间自然数中奇数之累加和,结果送RESULT单元中。该题属于循环次数已知,即将50以内的25个奇数进行累加和计算,可采用递增计数法来实现求累加和。程序设计如下。15DATASEGMENT RESULT DW?;定;定义结义结果保存果保存单单元元 CN EQU 25;定;定义计义计数次数数次数变变量量DATA ENDSCODE SEGMENT ASSUME DS:D
12、ATA,CS:CODESTART:MOV AX,DATA MOV DS,AX ;初始化;初始化DS MOV AX,0;循;循环环初始化初始化 MOV CX,CN MOV BX,1NEXT:ADD AX,BX ;求累加和;求累加和 ADD BX,2;(;(BX)(BX)+2 LOOP NEXT ;(;(CX)-10转转NEXT MOV RESULT,AX;计计算完算完毕毕保存保存结结果果 MOV AH,4CH INT 21H ;程序;程序结结束束CODE ENDS END START ;汇编结汇编结束束16 【例】编制程序完成求1+2+3+N的累加和,直到累加和超过1000为止。统计被累加的自然
13、数的个数送CN单元,累加和送SUM单元。该题的循环次数预先是不确定的,只能按照循环过程中的某个特定条件来决定循环是否继续执行。可通过测试条件是否成立来实现对循环的控制。程序设计如下。17DATA SEGMENT SUM DW?CN DW?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX;初始化;初始化DS MOV AX,0;0送送AX MOV BX,0;0送送BXLP:INC BX ;BX加加1 ADD AX,BX ;求累加和;求累加和 CMP AX,1000 ;比较;比较 JBE LP ;结果;结果10
14、00转转LP MOV SUM,AX MOV CN,BX ;送结果;送结果 MOV AH,4CH INT 21H ;返回;返回DOSCODEENDS END START ;汇编结束;汇编结束 18 3.多重循环程序设计多重循环程序设计(1)内循环应完整包含在外循环内,内外循环不能交叉。(2)内循环在外循环中位置可根据需要任意设置。(3)内循环可嵌套在外循环中,也可几个循环并列存在。(4)防止出现死循环。(5)每次完成外循环再次进入内循环时初始条件须重新设置。【例】数据段中有一组带符号数据,存放在从A单元开始的区域中,试编程序实现将它们按从小到大的顺序排序。要求排序后依然放在原来的存储区中。我们采
15、用冒泡法来设计该程序。从第一个数开始依次对两两相邻的两个数进行比较,如果次序符合要求(即第i个数小于第i+1个数),不做任何操作;否则两数交换位置。这样经过第一轮的两两比较(N-1次),最大数放到了最后。第二轮对前N-1个数做上面的工作,则把次大数放到了倒数第二个单元依次类推,做N-1轮同样的操作,就完成了从小到大排序。通过上述分析可以知道,该算法要用双重循环实现。外循环次数为N-1次,内循环次数分别为N-1次、N-2次、N-3次2次、1次。所以内循环的循环次数和外循环的计数器值有关,即等于外循环计数器的值。20DATA SEGMENT A DB 23,-15,34,67,-19,0,-12,
16、89,120,55 CN EQU$-ADATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX ;初始化;初始化DS MOV CX,CN-1 ;外循环次数送计数器;外循环次数送计数器CXLP1:MOV SI,OFFSET A ;赋指针;赋指针 PUSH CX ;外循环计数器入栈;外循环计数器入栈LP2:MOV AL,SI CMP AL,SI+1 ;相邻两个数比较;相邻两个数比较 JLE NEXT ;小于或等于转;小于或等于转NEXT XCHG AL,SI+1 ;否则;否则ASI和和ASI+1交换交换 MOV
17、SI,AL NEXT:INC SI ;指针加;指针加1 LOOP LP2 ;CX-1不为不为0转转LP2 POP CX ;否则退出内循环,将;否则退出内循环,将CX出出栈栈 LOOP LP1 ;CX-1不为不为0转转LP1 MOV AH,4CH INT 21H ;返回;返回DOSCODE ENDS END START ;汇编结束;汇编结束 213.5.4 子程序设计子程序设计 程序设计中,常把多处用到的同一个程序段或具有一定功能程序段单独存放在某一存储区域中,需要执行的时候,使用调用指令转到这段程序执行调用指令转到这段程序执行,执行完再返回原来程序执行完再返回原来程序,这个程序段就称为子程序。
18、调用子程序的程序段称为主程序。主程序中调用指令的下调用子程序的程序段称为主程序。主程序中调用指令的下一条指令的地址称为返回地址。一条指令的地址称为返回地址。22 1.主主子程序调用及功能分析子程序调用及功能分析【例例】设计一个子程序,完成统计一组设计一个子程序,完成统计一组字数据字数据中的正数和中的正数和0的个数。的个数。DATASEGMENT ARR DW -123,456,67,0,-34,-90,89,67,0,256 CN EQU($-ARR)/2 ZER DW?PLUS DW?DATAENDSCODE SEGMENT ASSUME DS:DATA,CS:CODESTART:MOV A
19、X,DATA MOV DS,AX ;初始化;初始化DS MOV SI,OFFSET ARR ;数组首地址送;数组首地址送SI MOV CX,CN ;数组元素个数送;数组元素个数送CX CALL PZN ;调用近过程;调用近过程PZN MOV ZER,BX ;0的个数送的个数送ZER MOV PLUS,AX ;正数的个数送;正数的个数送PLUS MOV AH,4CH INT 21H ;返回;返回DOS 23 ;子程序名:;子程序名:PZN ;子程序功能:统计一组字数据中的正数和;子程序功能:统计一组字数据中的正数和0的个数的个数 ;入口参数:数组首地址在;入口参数:数组首地址在SI中,数组个数在
20、中,数组个数在CX中中 ;出口参数:正数个数在;出口参数:正数个数在AX中,中,0的个数在的个数在BX中中 ;使用寄存器:;使用寄存器:AX、BX、CX、DX、SI及及PSWPZNPROC NEAR PUSH SI PUSH DX PUSH CX ;保护现场;保护现场 XOR AX,AX XOR BX,BX ;计数单元清;计数单元清0PZN0:MOV DX,SI ;取一个数组元素送;取一个数组元素送DX CMP DX,0 ;DX中内容和中内容和0比较比较 JL PZN1 ;小于;小于0转转PZN1 JZ ZN ;等于;等于0转转ZN INC AX ;否则为正数,;否则为正数,AX中内容加中内容
21、加1 JMP PZN1 ;转;转PZN1ZN:INC BX ;为;为0,BX中内容加中内容加1PZN1:ADD SI,2 ;数组指针加;数组指针加2调整调整 LOOP PZN0 ;循环控制;循环控制 POP CX POP DX POP SI ;恢复现场;恢复现场 RET ;返回主程序;返回主程序 PZN ENDP ;子程序定义结束;子程序定义结束CODEENDS ;代码段结束;代码段结束 END START ;汇编结束;汇编结束 从本例可以看出子程序的基本结构包括以下几个部分:(1)子程序说明:)子程序说明:用来说明子程序的名称、功能、入口参数、出口参数、占用工作单元的情况,明确该子程序的功能
22、和调用方法。(2)现场保护及恢复:)现场保护及恢复:由于汇编语言所处理的对象主要是CPU寄存器或内存单元,主程序在调用子程序时已经占用了一定的寄存器,子程序执行主程序在调用子程序时已经占用了一定的寄存器,子程序执行时又要用到这些寄存器,执行完毕返回主程序后,为了保证主程序按原有时又要用到这些寄存器,执行完毕返回主程序后,为了保证主程序按原有的状态继续正常执行,需要对这些寄存器的内容加以保护,这就是保护现的状态继续正常执行,需要对这些寄存器的内容加以保护,这就是保护现场;场;子程序执行完毕后再恢复这些被保护的寄存器的内容,称为恢复现场。现场保护及恢复通常采用堆栈操作。(3)子程序体)子程序体:这
23、一部分内容用来实现相应的子程序功能。(4)子程序返回:)子程序返回:子程序的返回语句RET和主程序中的调用语句CALL相互对应,才能正确实现子程序的调用和返回。返回指令用来恢复被中断位置的地址。汇编语言中子程序实现参数传递的方法主要有汇编语言中子程序实现参数传递的方法主要有3种:种:(1)寄存器传递:寄存器传递:适合于需要传递的参数较少的情况。在调用子程序之前把参数放到规定的寄存器中,由这些寄存器将参数带入子程序中,执行子程序结束后的结果也放到规定的寄存器中带回主程序。(2)堆栈传递:堆栈传递:通过堆栈这个临时存储区来实现参数传递,主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口
24、参数压入堆栈,主程序从堆栈中取出参数。(3)存储器传递:存储器传递:若调用程序和子程序在同一个程序模块内,采用存储器传递参数是最简单的方法。通常在数据段内定义出要传送的数据变量,也称为数据缓冲区,子程序对这些定义的变量直接访问即可。26 DOS调用程序设计调用程序设计【例例】编程实现用编程实现用DOS功能调用完成屏幕光标的回车和换行处理功能。功能调用完成屏幕光标的回车和换行处理功能。分析:采用子程序调用分析:采用子程序调用DOS功能,先在功能,先在AH寄存器中设置系统功能调用号;其次在寄存器中设置系统功能调用号;其次在指定寄存器中设置入口参数;最后采用中断调用指令来实现功能调用。指定寄存器中设
25、置入口参数;最后采用中断调用指令来实现功能调用。源程序:源程序:CRLF PROCFAR ;定义过程名为定义过程名为CRLFPUSH AX;保护现场保护现场PUSH DXMOV DL,0DH;入口参数入口参数,回车回车CR的的ASCII码码MOV AH,02H;设置系统子功能号设置系统子功能号INT 21H;DOS调用调用,显示单个字符显示单个字符MOV DL,0AH;入口参数入口参数,换行换行LR的的ASCII码码MOV AH,02H;设置系统子功能号设置系统子功能号INT 21H;DOS调用调用,显示单个字符显示单个字符POP DX;恢复现场恢复现场POP AXRET ;子程序返回子程序返
26、回CRLF ENDP ;过程结束过程结束 27 【例例】在屏幕上给出在屏幕上给出“输入一个字符串输入一个字符串”的提示信息,要求从键盘输的提示信息,要求从键盘输入相应字符串,并在屏幕上显示输出。入相应字符串,并在屏幕上显示输出。源程序:源程序:DATA SEGMENT STR DB please input a string:$;定义字符串定义字符串 BUF DB 20 DB?DB 20 DUP(?)CRLF DB 0AH,0DH,$;回车及换行的回车及换行的ASCII码码DATA ENDSSTACK SEGMENT STACK;定义堆栈区定义堆栈区 DB 20 DUP(?)STACK END
27、S28 CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATA MOVDS,AX LEADX,STR ;取字符串首地址取字符串首地址 MOVAH,09H ;DOS调用显示字符串调用显示字符串 INT21HMOVAH,0AH ;DOS调用输入字符串调用输入字符串LEADX,BUF ;取内存预留字符串首地址取内存预留字符串首地址INT21HLEA DX,CRLF ;调回车及换行调回车及换行MOV AH,09HINT 21HMOV CL,BUF+1;取初始数据取初始数据LEA SI,BUF+2;取地址取地址NEXT:MOV DL,SI
28、 ;取单个字符到取单个字符到DLMOV AH,02H ;输出单个字符输出单个字符INT 21HINC SI ;地址加地址加1DECCL ;数据个数减数据个数减1JNZNEXT ;非非0转转NEXTMOV AH,4CHINT 21HCODE ENDS ENDSTART 汇编语言是面向机器的程序设计语言,它使用指令助记符、符号地址及标号编制程序,要熟悉汇编语言源程序的基本格式,正确运用语句格式来书写程序段,掌握伪指令的功能和应用,并通过上机操作,熟悉编辑程序、汇编程序、连接程序和调试程序等软件工具的使用,掌握源程序的建立、汇编、连接、运行、调试等技能。汇编语言小结汇编语言小结 顺序结构是按照语句实
29、现的先后次序执行一系列的操作,是最简单的一种结构。分支结构是程序设计中常用的结构之一,它有两分支和多分支两种形式。循环结构用来实现需要重复执行的操作,通常由循环初始化、循环处理部分、循环修改部分和循环控制部分4部分组成。子程序设计是把多处用到的同一个程序段或者具有一定功能的程序段单独存放在某一存储区域中,需要执行的时候,使用调用指令转到这段程序来执行,执行完再返回原来的程序。这样做提高了程序段的利用率,也有利于模块化的程序设计和开发。汇编语言小结汇编语言小结31本章小结本章小结l汇编语言用指令助记符、符号地址及标号编制程序。l要熟悉源程序基本格式,掌握伪指令功能和应用;l要掌握源程序建立、汇编、连接、运行、调试等技能。l顺序结构按照语句先后次序执行一系列操作。l分支结构有两分支和多分支两种形式。l循环结构实现需要重复执行的操作,由循环初始化、循环处理、循环修改和循环控制组成。l 子程序把多处用到的同一程序段单独存放,执行时调用,执行完返回原来程序。l编写源程序还可使用宏汇编、重复汇编和条件汇编。采用高级汇编技术能减少程序员的工作量,减少程序出错的可能性。