收藏 分享(赏)

3.5 程序设计 高级汇编技术 待修改.ppt

上传人:hyngb9260 文档编号:5587657 上传时间:2019-03-09 格式:PPT 页数:31 大小:121KB
下载 相关 举报
3.5  程序设计 高级汇编技术 待修改.ppt_第1页
第1页 / 共31页
3.5  程序设计 高级汇编技术 待修改.ppt_第2页
第2页 / 共31页
3.5  程序设计 高级汇编技术 待修改.ppt_第3页
第3页 / 共31页
3.5  程序设计 高级汇编技术 待修改.ppt_第4页
第4页 / 共31页
3.5  程序设计 高级汇编技术 待修改.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

1、3.5 汇编语言程序设计,指令或语句就是告诉计算机为完成某一计算步骤需要执行的操作。程序是为了求解某个问题所必须的完整的指令序列或语句串加上必要的数据。程序设计是编写程序的过程。 当在设计一个程序时,应该考虑满足以下目标: 1)程序的正确性。 2)增强程序的可读性。 3)所写程序应该是结构化的,易修改,易调试,即程序的可维护性。,2,程序的基本结构程序是指令(语句)的有序集合,是对系统任务处理步骤的描述。程序的执行是有一定顺序的,依据执行顺序可将程序分为如下基本结构: 顺序结构、 分支(选择)结构、 循环结构和 子程序结构。 (1)顺序结构:按语句先后次序执行一系列顺序操作。 (2)分支结构:

2、也叫条件选择结构,根据不同情况做出判断和选择,以便执行不同的程序段。 (3)循环结构:循环实际上是分支结构的一种扩展,循环是否继续是依靠条件判断语句来完成的。按照条件判断的位置,可以把循环分为“当型循环”和“直到型循环”。 每个结构只有一个入口和出口,3种结构可以任意组合和嵌套构成结构化的程序。,3,3.5.1 顺序结构程序设计 顺序结构程序从执行开始到最后一条指令为止,指令指针IP中的内容呈线性增加; 设计这种程序只要遵照算法步骤依次写出相应的指令即可。 顺序结构程序设计时,主要考虑如何选择简单有效的算法,如何选择存储单元和工作单元。,4,例 从键盘输入一个小写英文字母,将其转换成大写英文字

3、母后在屏幕上显示出来。分析:利用DOS功能调用INT 21H指令实现。键盘输入一个字符可用01H调用,屏幕上显示字符可用02H调用。从ASCII码表中可知,将小写字母转换成大写字母只要将其ASCII码减去32即可。为简化程序设计,假设从键盘输入的字符一定是小写字母。,5,STACK SEGMENT STACK ;定义堆栈段DB 100 DUP(?) ;开辟100个存储单元 STACK ENDS ;堆栈段结束 CODE SEGMENT ;定义代码段ASSUME CS:CODE , SS:STACK START: MOV AH ,01H ;1号调用,从键盘输入一字符存入ALINT 21HSUB A

4、L ,20H ;将AL中字符的ASCII码减去20H变成大写字母MOV DL ,AL ;结果送DLMOV AH ,02H ;2号调用,在屏幕上显示DL中的内容INT 21H MOV AH ,4CH ;返回DOS INT 21H CODE ENDS ;代码段结束END START ;程序汇编结束,注意 : 复制时候 标点符号修改,英文输入法,6,3.5.2 分支结构程序设计分支程序的结构可以有两种形式: 双分支结构 多分支结构,【例 】已知在内存中有一个字节单元X,存有带符号数据,要求计算出它的绝对值后,放入RESULT单元中。 分析:根据数学中绝对值的概念知道,一个正数的绝对值是它本身,而一个

5、负数的绝对值是它的相反数;要计算一个数的相反数,需要完成减法运算,即用0减去这个数。8086指令系统中有专门的求相反数的指令NEG。源程序设计如下:,DATA SEGMENTX DB -25 ;定义变量RESULT DB ? ;定义结果保存单元 DATA ENDS CODE SEGMENTASSUME DS:DATA,CS:CODE START: MOV AX,DATAMOV DS,AX ;初始化DSMOV AL,X ;X取到AL中TEST AL,80H ;测试AL正负JZ NEXT ;为正,转NEXTNEG AL ;否则AL求补 NEXT: MOV RESULT,AL ;送结果MOV AH,

6、4CHINT 21H ;返回DOS CODE ENDSEND START ;汇编结束,9,【例】设变量X为带符号整数,试编写一个程序,完成下面的分段函数计算:题目分析:为实现分段函数计算,先利用上一个例题求出X的绝对值,然后根据X绝对值判断Y取值。程序段如下。,AL送Y单元,1-X送AL,0送AL,AL大于等于5,开始,将X取到AL中,AL中的内容求绝对值,结束,10,DATA SEGMENT X DB -36Y DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE;DS:DATA START:MOV AX,DATAMOV DS,AX MOV AL,X CMP

7、AL,0 JGE NEXT ;为正,转NEXT NEG AL ;AL中的内容求补 NEXT: CMP AL,5 ;|X|和5比较JGE P1 ;5,转P1MOV AL,1 ;否则1送ALMOV BL,X ;X送BL中SUB AL,BL ;结果送AL中JMP EXIT ;转EXIT P1: MOV AL,0 ;0送AL中 EXIT: MOV Y,AL ;结果送Y单元MOV AH,4CHINT 21H ;返回DOS CODE ENDSEND START ;汇编结束,【例】设计一个程序,统计在内存W单元保存的无符号字变量中有多少个二进制“1”,统计结果送内存N单元保存。分析:要统计内存W单元保存的无

8、符号字变量中有多少个二进制“1”,可以将该数据送寄存器AX中,通过移位指令将AX中的每一位依次移入进位标志CF中,若CF=1则计数器CL的值加1,这样就可以统计出AX中1的个数。 设计源程序如下:。,DATA SEGMENTW DW 00FFH ;定义字数据N DB ? ;定义结果保存单元 DATA ENDS CODE SEGMENTASSUME CS:CODE, DS:DATA START: MOV AX,DATA ;初始化DSMOV DS,AXMOV CL,0 ;计数器清零 MOV AX,W ;取数到AXAA:AND AX,AX ;逻辑与,判AX=0?JZ CC ;结果为0转移到CCSHL

9、 AX,1 ;逻辑左移1位JNC BB ;无进位转BBINC CL ;有“1”则计数BB:JMP AA ;无条件转AACC:MOV N,CL ;结果送N单元MOV AH,4CH ;返回DOSINT 21H CODE ENDSEND START ;汇编结束,13,3.5.3 循环结构程序设计1. 循环程序的基本组成 循环结构程序主要由以下4个部分组成: (1)初始化部分 (2)循环体 (3)参数修改部分 (4)循环控制部分,14,2. 单循环程序设计 【例】编程完成求150之间自然数中奇数之累加和,结果送RESULT单元中。该题属于循环次数已知,即将50以内的25个奇数进行累加和计算,可采用递增

10、计数法来实现求累加和。程序设计如下。,15,DATA SEGMENTRESULT DW ? ;定义结果保存单元CN EQU 25 ;定义计数次数变量 DATA ENDS CODE SEGMENTASSUME DS:DATA,CS:CODE START: MOV AX,DATAMOV DS,AX ;初始化DSMOV AX,0 ;循环初始化MOV CX,CNMOV BX,1 NEXT: ADD AX,BX ;求累加和ADD BX,2 ;(BX)(BX)+2LOOP NEXT ;(CX)-10转NEXTMOV RESULT,AX ;计算完毕保存结果MOV AH,4CH INT 21H ;程序结束 C

11、ODE ENDSEND START ;汇编结束,16,【例】编制程序完成求1+2+3+N的累加和,直到累加和超过1000为止。统计被累加的自然数的个数送CN单元,累加和送SUM单元。该题的循环次数预先是不确定的,只能按照循环过程中的某个特定条件来决定循环是否继续执行。可通过测试条件是否成立来实现对循环的控制。程序设计如下。,17,DATA SEGMENTSUM DW ?CN DW ? DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AX ;初始化DSMOV AX,0 ;0送AXMOV BX,0 ;0送B

12、X LP: INC BX ;BX加1ADD AX,BX ;求累加和CMP AX,1000 ;比较 JBE LP ;结果1000转LPMOV SUM,AXMOV CN,BX ;送结果MOV AH,4CHINT 21H ;返回DOS CODE ENDS END START ;汇编结束,18,3. 多重循环程序设计 (1)内循环应完整包含在外循环内,内外循环不能交叉。 (2)内循环在外循环中位置可根据需要任意设置。 (3)内循环可嵌套在外循环中,也可几个循环并列存在。 (4)防止出现死循环。 (5)每次完成外循环再次进入内循环时初始条件须重新设置。,【例】数据段中有一组带符号数据,存放在从A单元开始

13、的区域中,试编程序实现将它们按从小到大的顺序排序。要求排序后依然放在原来的存储区中。我们采用冒泡法来设计该程序。从第一个数开始依次对两两相邻的两个数进行比较,如果次序符合要求(即第i个数小于第i+1个数),不做任何操作;否则两数交换位置。这样经过第一轮的两两比较(N-1次),最大数放到了最后。第二轮对前N-1个数做上面的工作,则把次大数放到了倒数第二个单元依次类推,做N-1轮同样的操作,就完成了从小到大排序。通过上述分析可以知道,该算法要用双重循环实现。外循环次数为N-1次,内循环次数分别为N-1次、N-2次、N-3次2次、1次。所以内循环的循环次数和外循环的计数器值有关,即等于外循环计数器的

14、值。,20,DATA SEGMENTA DB 23,-15,34,67,-19, 0,-12,89,120,55CN EQU $-A DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AX ;初始化DSMOV CX,CN-1 ;外循环次数送计数器CX LP1: MOV SI,OFFSET A ;赋指针PUSH CX ;外循环计数器入栈 LP2: MOV AL, SI CMP AL, SI+1 ;相邻两个数比较JLE NEXT ;小于或等于转NEXTXCHG AL,SI+1 ;否则ASI和ASI+1交换MO

15、V SI,AL NEXT: INC SI ;指针加1LOOP LP2 ;CX-1不为0转LP2POP CX ;否则退出内循环,将CX出栈LOOP LP1 ;CX-1不为0转LP1MOV AH,4CHINT 21H ;返回DOS CODE ENDSEND START ;汇编结束,21,3.5.4 子程序设计程序设计中,常把多处用到的同一个程序段或具有一定功能程序段单独存放在某一存储区域中,需要执行的时候,使用调用指令转到这段程序执行,执行完再返回原来程序,这个程序段就称为子程序。调用子程序的程序段称为主程序。主程序中调用指令的下一条指令的地址称为返回地址。,22,1. 主子程序调用及功能分析 【

16、例 】设计一个子程序,完成统计一组字数据中的正数和0的个数。 DATA SEGMENTARR DW -123,456,67,0,-34,-90,89,67,0,256CN EQU ($-ARR)/2ZER DW ?PLUS DW ? DATA ENDS CODE SEGMENTASSUME DS:DATA,CS:CODE START:MOV AX,DATAMOV DS,AX ;初始化DSMOV SI,OFFSET ARR ;数组首地址送SIMOV CX,CN ;数组元素个数送CXCALL PZN ;调用近过程PZNMOV ZER,BX ;0的个数送ZERMOV PLUS,AX ;正数的个数送P

17、LUSMOV AH,4CHINT 21H ;返回DOS,23,;子程序名:PZN;子程序功能:统计一组字数据中的正数和0的个数;入口参数:数组首地址在SI中,数组个数在CX中;出口参数:正数个数在AX中,0的个数在BX中;使用寄存器:AX、BX、CX、DX、SI及PSW PZN PROC NEARPUSH SIPUSH DXPUSH CX ;保护现场XOR AX,AXXOR BX,BX ;计数单元清0 PZN0: MOV DX,SI ;取一个数组元素送DXCMP DX,0 ;DX中内容和0比较JL PZN1 ;小于0转PZN1JZ ZN ;等于0转ZNINC AX ;否则为正数,AX中内容加1

18、JMP PZN1 ;转PZN1 ZN: INC BX ;为0,BX中内容加1 PZN1: ADD SI,2 ;数组指针加2调整LOOP PZN0 ;循环控制POP CXPOP DXPOP SI ;恢复现场RET ;返回主程序PZN ENDP ;子程序定义结束 CODE ENDS ;代码段结束END START ;汇编结束,从本例可以看出子程序的基本结构包括以下几个部分:(1)子程序说明:用来说明子程序的名称、功能、入口参数、出口参数、占用工作单元的情况,明确该子程序的功能和调用方法。 (2)现场保护及恢复:由于汇编语言所处理的对象主要是CPU寄存器或内存单元,主程序在调用子程序时已经占用了一定

19、的寄存器,子程序执行时又要用到这些寄存器,执行完毕返回主程序后,为了保证主程序按原有的状态继续正常执行,需要对这些寄存器的内容加以保护,这就是保护现场;子程序执行完毕后再恢复这些被保护的寄存器的内容,称为恢复现场。现场保护及恢复通常采用堆栈操作。 (3)子程序体:这一部分内容用来实现相应的子程序功能。 (4)子程序返回:子程序的返回语句RET和主程序中的调用语句CALL相互对应,才能正确实现子程序的调用和返回。返回指令用来恢复被中断位置的地址。,汇编语言中子程序实现参数传递的方法主要有3种:(1)寄存器传递:适合于需要传递的参数较少的情况。在调用子程序之前把参数放到规定的寄存器中,由这些寄存器

20、将参数带入子程序中,执行子程序结束后的结果也放到规定的寄存器中带回主程序。 (2)堆栈传递:通过堆栈这个临时存储区来实现参数传递,主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序从堆栈中取出参数。 (3)存储器传递:若调用程序和子程序在同一个程序模块内,采用存储器传递参数是最简单的方法。通常在数据段内定义出要传送的数据变量,也称为数据缓冲区,子程序对这些定义的变量直接访问即可。,26,DOS调用程序设计【例 】编程实现用DOS功能调用完成屏幕光标的回车和换行处理功能。 分析:采用子程序调用DOS功能,先在AH寄存器中设置系统功能调用号;其次在指定寄存器中设置入

21、口参数;最后采用中断调用指令来实现功能调用。 源程序: CRLF PROC FAR ;定义过程名为CRLF PUSH AX ;保护现场 PUSH DX MOV DL,0DH ;入口参数,回车CR的ASCII码 MOV AH,02H ;设置系统子功能号 INT 21H ;DOS调用,显示单个字符 MOV DL,0AH ;入口参数,换行LR的ASCII码 MOV AH,02H ;设置系统子功能号 INT 21H ;DOS调用,显示单个字符 POP DX ;恢复现场 POP AX RET ;子程序返回 CRLF ENDP ;过程结束,27,【例 】在屏幕上给出“输入一个字符串”的提示信息,要求从键盘

22、输入相应字符串,并在屏幕上显示输出。 源程序: DATA SEGMENTSTR DB please input a string :$ ;定义字符串BUF DB 20DB ?DB 20 DUP(?) CRLF DB 0AH,0DH,$ ;回车及换行的ASCII码 DATA ENDS STACK SEGMENT STACK ;定义堆栈区DB 20 DUP(?) STACK ENDS,28,CODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODE START:MOV AX,DATAMOV DS,AXLEA DX,STR ;取字符串首地址MOV AH,09H ;DOS调

23、用显示字符串INT 21H MOV AH,0AH ;DOS调用输入字符串LEA DX,BUF ;取内存预留字符串首地址INT 21HLEA DX,CRLF ;调回车及换行MOV AH,09HINT 21H MOV CL,BUF+1 ;取初始数据LEA SI,BUF+2 ;取地址 NEXT: MOV DL,SI ;取单个字符到DLMOV AH,02H ;输出单个字符INT 21HINC SI ;地址加1DEC CL ;数据个数减1JNZ NEXT ;非0转NEXTMOV AH,4CHINT 21H CODE ENDSEND START,汇编语言是面向机器的程序设计语言,它使用指令助记符、符号地址

24、及标号编制程序,要熟悉汇编语言源程序的基本格式,正确运用语句格式来书写程序段,掌握伪指令的功能和应用,并通过上机操作,熟悉编辑程序、汇编程序、连接程序和调试程序等软件工具的使用,掌握源程序的建立、汇编、连接、运行、调试等技能。,汇编语言小结,顺序结构是按照语句实现的先后次序执行一系列的操作,是最简单的一种结构。分支结构是程序设计中常用的结构之一,它有两分支和多分支两种形式。循环结构用来实现需要重复执行的操作,通常由循环初始化、循环处理部分、循环修改部分和循环控制部分4部分组成。子程序设计是把多处用到的同一个程序段或者具有一定功能的程序段单独存放在某一存储区域中,需要执行的时候,使用调用指令转到

25、这段程序来执行,执行完再返回原来的程序。这样做提高了程序段的利用率,也有利于模块化的程序设计和开发。,汇编语言小结,31,本章小结,汇编语言用指令助记符、符号地址及标号编制程序。 要熟悉源程序基本格式,掌握伪指令功能和应用; 要掌握源程序建立、汇编、连接、运行、调试等技能。 顺序结构按照语句先后次序执行一系列操作。 分支结构有两分支和多分支两种形式。 循环结构实现需要重复执行的操作,由循环初始化、循环处理、循环修改和循环控制组成。子程序把多处用到的同一程序段单独存放,执行时调用,执行完返回原来程序。 编写源程序还可使用宏汇编、重复汇编和条件汇编。采用高级汇编技术能减少程序员的工作量,减少程序出错的可能性。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报