第二章 实模式程序设计(汇编语言)5.ppt_第1页
第二章 实模式程序设计(汇编语言)5.ppt_第2页
第二章 实模式程序设计(汇编语言)5.ppt_第3页
第二章 实模式程序设计(汇编语言)5.ppt_第4页
第二章 实模式程序设计(汇编语言)5.ppt_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,2.4汇编语言程序设计,分析问题:通过详细的了解和分析,将一个实际问题转化为一个计算机可以处理的问题。 确定算法:抽象出描述问题的数学模型,并确定实现数学模型的算法. 算法就是计算机能够实现的操作方法和操作步骤。 算法的流程图描述法:流程图中较为通用的几种符号:,2.4.1基本步骤,起始框:,执行框:,判断框:,连接符,2,起始和终止框是表示程序开始和结束的符号,它总是在一个流程图的开头或结尾处; 执行框用来表示须完成的某项功能,它可以是一条指令或一段程序,但是无论哪种情况,该框只能有一个入口和一个出口; 判断框是用来表示程序在此处要根据不同情况形成分支,框内需写明比较的条件,此框有一个入

2、口,两个出口; 连接符是用来连接两个流程框图的符号,圆形符号内可写入标识符,不同流程框图中连接符中的标识符相同的各点将连接在一起,2.4汇编语言程序设计,2.4.1基本步骤,3,编写程序 采用汇编语言编写程序应注意以下几个问题: 必须详细了解所用CPU的编程模型、指令系统、寻址方式及有关伪指令; 必须进行存储空间和工作单元的合理分配; 多次使用的程序段可采用子程序或宏指令; 尽可能用标号或变量来代替绝对地址和常数。,2.4汇编语言程序设计,2.4.1基本步骤,4,程序检验 程序编好以后,必须经过书面检查和上机调试,以便说明程序是否正确。检验时,应预先选择典型数据,检查是否可以得到预期结果。 编

3、写文档 一个完整的软件必须有相应的说明文件,这不仅便于用户使用,也便于对程序的维护和扩充。说明文件主要包括程序的功能和使用方法,程序的基本结构和所采用的主要算法以及程序的必要说明和注意事项等。,2.4汇编语言程序设计,2.4.1基本步骤,5,按照指令执行的顺序,程序的结构可以划分成以下三种。 顺序结构:程序按照它编写的顺序执行,每条指令只执行一 次,这样的程序称为“顺序结构”的程序。 循环结构:一组指令被反复地执行,这样的程序称为“循环结 构”或者“重复结构”的程序。 选择结构:根据某个条件,一部分指令被执行,另一部分指 令没有被执行,这样的程序称为“选择结构”或者 “分支结构”的程序。 一个

4、实际运行的程序,常常是由以上三种结构的程序组合而成的, 上面的三种结构称为程序的“基本结构”。使用这三种基本结构,可 以编写出任何所需要的程序。,2.4汇编语言程序设计,6,2.4汇编语言程序设计,2.4.2顺序程序,例2-4-2-1 将存储器中的二个字节相加,结果(和)送到另一个存储器单元中。 此题的算法及思路是: 1、先将一个字节数据从存储单元送入累加器; 2、然后再把累加器的内容与第二个存储单元的数据相加(和不超过一个字节); 3、将结果(和)再从累加器送回存储器存放结果的单元中。,7,2.4汇编语言程序设计,2.4.2顺序程序,DATA SEGMENT BUFFER1 DB 47H,6

5、AH SUM1 DB ? DATA ENDS STAK SEGMENT PARA STACK STACK DB 10 DUP(0) TOP LABEL WORD STAK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STAK START:MOV AX,DATA MOV DS,AX MOV AX, STAK MOV SS,AX MOV SP OFFSET TOP MOV AH,BUFFER1 ADD AH,BUFFER1+1 ;两数据相加 MOV SUM1,AH ;存放结果 MOV AH,00H;退出程序,返回DOS INT 21H CODE ENDS

6、 END START,8,2.4汇编语言程序设计,2.4.2顺序程序,例2-4-2-2将一字节压缩BCD码转换为两个ASCII 1、首先将一字节压缩BCD码从BCDBUF中取入寄存器; 2、然后将此二位BCD码一分为二拆开,形成二位非压缩的BCD码(并使它们的高四位都置0);3、然后都加以30H,形成二个ASCII码; 4、再按先高后低的次序存入ASCBUF符号地址的连续二个单元中(此次序正好满足将来输出显示和打印的次序),程序流程图如图所示:,9,2.4汇编语言程序设计,2.4.2顺序程序,DATA SEGMENT BCDBUF DB 96H ASCBUF DB 2 DUP(?) DATA

7、ENDS STAK SEGMENT PARA STACK STACK DB 10 DUP(0) TOP LABEL WORD STAK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STAK START: MOV AX,DATA MOV DS,AX MOV AX, STAK MOV SS,AX MOV SP OFFSET TOP MOV AL,BCDBUF ;AL(BCD BUF) MOV BL,AL ;BL(BCD BUF) MOV CL,4 SHR AL,CL ;BCD码中高位移入低位,高位补0 ADD AL,30H ;形成BCD高位的ASCII码

8、。 MOV ASCBUF,AL ;送入ASC BUF单元中 AND BL,0FH ;取BCD码低位,高位补0 ADD BL,30H ;形成BCD低位的ASCII码。 MOV ASCBUF+1,BL;送入ASC BUF+1单元中。 MOV AH,00H;退出程序,返回DOS INT 21H CODE ENDS END START,10,分支程序结构 分支程序概念:计算机在完成某种运算或某个过程的控制时,经常需要根据不同的情况(条件)实现不同的功能,这就要求在程序的执行过程中能够进行某种条件的判定,并根据判定结果决定程序的流向,这就是分支程序 。 分支程序分类:分为二分支结构和多分枝结构 二分支结

9、构只进行二中选一的判定,程序中只出现一个分支; 多分枝结构是进行多选一。,2.4汇编语言程序设计,2.4.3分支程序,11,2.4汇编语言程序设计,二分支结构只进行二中选一的判定,程序中只出现一个分支;其流程图如下:,2.4.3分支程序,12,2.4汇编语言程序设计,多分枝结构是进行多选一,其流程图如下:,2.4.3分支程序,13,2.4汇编语言程序设计,分支程序设计 分支程序设计时必须注意以下几个要点: 正确选择判定条件和相应的条件转移指令; 在编程时必须保证每条分支都能有完整的结果; 在检查和调试时必须逐条分支进行,因为一条或其中几条分支正确还不足以说明整个程序正确。,2.4.3分支程序,

10、14,2.4汇编语言程序设计,分支程序设计 计算AX |AX| 的两种判断方法:,2.4.3分支程序,15,2.4汇编语言程序设计,分支程序设计 例2 4-3-1 求X的绝对值,并送回原处。 分析:按题义要求,运算结果X的值与原给出的X值关系如下:,2.4.3分支程序,16,2.4汇编语言程序设计,2.4.3分支程序,DATA SEGMENT ;定义数据段 XADR DW 3456H , 8192H ;定义数据X N EQU 2 DATA ENDS STAK SEGMENT STACK STACK DB 10 DUP(0) TOP LABEL WORD STAK ENDS CODE SEGME

11、NT ;定义代码段 ASSUME CS:CODE, DS:DATA,SS:STAK START: MOV AX, DATA MOV DS, AX MOV AX, STAK MOV SS,AX MOV SP , OFFSET TOP LEA BX, XADR MOV CX, N LOP1: MOV AX, BX ;取数据X AND AX, AX JNS DONE ;非负数则转 NEG AX ;否则,取负 MOV BX, AX DONE: INC BX INC BX LOOP LOP1 MOV AH, 4CH ;退出 INT 21H CODE ENDS ENDSTART,17,例2-4-3-2 在

12、某串中查找某个特定字符,找到显示Y,未找到显示N。,DATASEGMENT STRING DB How are you!,welcome to China! N EQU STRING DATAENDS CODESEGMENT ASSUME CS:CODE,ES:DATA START:MOVAX,DATA;置ES段初值 MOV ES,AX LEA DI,STRING MOV CX,N CLD,18,MOV AH,1 INT 21H;从键盘输入待查字符 REPNE SCASB JZ FOUND;转到找到分支 MOVDL,N;未找到处理,显示N JMP DISP;转到后续公共位置处 FOUND:MO

13、V DL,Y;找到显示Y DISP: MOV AH,2 INT 21H MOV AH,4CH;返回DOS INT 21H CODEENDS ENDSTART,19,2.4汇编语言程序设计,分支程序设计 例2 4-3-3 将4位二进制转换成对应的十六进制字符 本题要求将0000转换成0,0001转换成1,1010转换成A,.1111 转换成F。二进制数X和十六进制字符Y之间的转换实际上是计算分 段函数。,2.4.3分支程序,MOVAL, X CMPAL, 9 JAALPH ADDAL, 30H JMPDONE ALPH: ADDAL, 37H DONE: MOVY, AL,0、1、2、3.9的A

14、SCII为:30、31、32、3339 A、B、C.F的ASCII为:41、42、4346,MOVAL, X ORAL, 30H CMPAL, 9 JBEDONE ADDAL, 7 DONE: MOVY, AL,20,例2-4-3-4 从键盘输入一位十六进制数,将其转换为数值。,在选择结构程序里,如果可供选择的程序块多于两个,这样的结构称为多分支选择结构,如下图 (b)是汇编语言程序的实现方法。,21,例2-4-3-4 从键盘输入一位十六进制数,将其转换为数值。,CODESEGMENT ASSUME CS:CODE AGAIN:MOV AH,l INT 21H CMP AL,0 JB AGAI

15、N CMP AL,9 JBE BET0_9 CMP AL,A JB AGAIN,CMPAL,F JBE BETA_F JMP AGAIN BET0_9:SUBAL,30H JMP EXIT BETA_F :SUB AL,37H ;AL中存放转化后 ; 的结果 EXIT:MOV AH,4CH INT21H CODEENDS END AGAIN,22,2.4.3分支程序,例2-4-3-5从键盘上输入数字“1”到“3”,根据输入选择对应程序块执行。,DATASEGMENT PROMPTDB0DH, 0AH, “Input a number (13): $” MSG1 DB0DH, 0AH, “FUN

16、CTION 1 EXECUTED . $” MSG2 DB0DH, 0AH, “FUNCTION 2 EXECUTED . $” MSG3 DB0DH, 0AH, “FUNCTION 3 EXECUTED . $” DATAENDS CODESEGMENT ASSUMECS: CODE, DS: DATA START:MOVAX, DATA MOVDS, AX INPUT:LEADX, PROMPT MOVAH, 9 INT21H;输出提示信息 MOVAH, 1 INT21H;从键盘上输入一个数字(字符ASCII ) CMPAL, 1 JBINPUT;“0”或非数字,重新输入 JEF1,23,

17、CMPAL, 2 JEF2;数字“2”,转F2 CMPAL, 3 JEF3;数字“3”,转F3 JMPINPUT;大于“3”,重新输入 F1:LEADX, MSG1;F1程序块 JMPOUTPUT F2:LEADX, MSG2;F2程序块 JMPOUTPUT F3:LEADX, MSG3;F3程序块 OUTPUT: MOVAH, 9 INT21H MOVAX, 4C00H INT21H CODEENDS ENDSTART,例2-4-3-5从键盘上输入数字“1”到“3”,根据输入选择对应程序块执行。,24,2.4汇编语言程序设计,循环程序的基本结构,2.4.4循环程序,循环准备部分:这是为循环做

18、准备的,它不在循环体内。 循环工作部分:这部分是循环程序解题所需的核心程序。这部分程序可以很简单,也可以很复杂,甚至包括循环结构。 调整部分:这部分主要用来更新某些数据,以保证每次循环所完成的功能不是完全重复的。此外,调整部分还必须修正循环控制的参数。为实现正常循环,调整部分是不可缺少的。因此,在进行循环程序设计时,就必须预先考虑哪些参数是需要在循环过程中加以调整的。若需调整参数为地址,应将起始地址放在基址或变址寄存器中,采用寄存器间接寻址方式。 循环出口判定:循环程序中至少要有一个出口判定,以保证循环程序正常结束。,25,2.4汇编语言程序设计,例24-4-1 编制计算SUM=A1+A2+A

19、3+A4+A5+A6+A7+A8+A9+A10。 已知A1、A2、A3、A4、A5、A6、A7、A8、A9、A10连续存 放在以BUFFER为首址的数据区中,每个数据占一个字节,和 SUM不超过一个字节。 分析:这个求和问题的程序设计并不困难,可以用我们学过的顺 序结构方法来编程,但是10 次加法运算指令完全相同,重复10 次。用顺序编写就比较麻烦了,并且占用大量的时间和存储空 间。所以我们采用循环结构的程序设计。注意两个问题: 1、必须要设置控制计算机重复执行某公共程序段的指令。 2、必须要对循环参数进行修改,以便使相同指令的公共程序段能完成不同参数的操作处理。,2.4.4循环程序,26,2

20、.4汇编语言程序设计,例24-4-1 下面我们画出程序流程图,并根据流程图编写程序。,2.4.4循环程序,DATA SEGMENT BUFFER DB 0,2,3,14,5,16,7,8,19,10 SUM DB ? DATA ENDS STAK SEGMENT PARA STACK STACK DB 10 DUP(0) STAK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STAK START:MOV AX,DATA MOV DS,AX MOV AX, STAK MOV SS,AX MOV AL,0 ;AL清0 MOV DI,OFFSET SUM

21、;DI存放结果地址 MOV BX,OFFSET BUFFER;BX操作数地址 MOV CX,10 ;CX循环次数 ;是循环准备部分 LOP: ADD AL,BX ; 循环工作部分 INC BX ;修改操作数地址. DEC CX ;循环计数控制 JNZ LOP ;循环判断部分 MOV DI,AL ;存放结果(和). MOV AH,00H ;退出程序,返回DOS INT 21H CODE ENDS END START,27,2.4汇编语言程序设计,例2 4-4-2 将ASCII码表示的5位十进制数转换成两字节二进制数。 分析:设用ASCII码表示的5位十进制数存放在以ADEC为首地址的数据区中,转

22、换后的两字节二进制数存放在同一数据段的RESULT字单元中。,2.4.4循环程序,实际处理算式: (30H-30H)*10+(31H-30H)*10+(33H-30H)*10+(30H-30H)*10+(38H-30H) = (0*10)+1*10+3*10+0*10+8 = 1*10+13*10+0*10+8 =13*10+0*10+8 =130*10+8 =1308D=051CH=0000010100011100B,28,2.4汇编语言程序设计,具体转换算法如下: 设AX为存结果的寄存器 1、AX AX*10 ;按权相乘, 2、BX 取一位十进制数的ASCII 3、BX BX-30H;转换

23、成09 4、AX AX+BX;合并结果 5、重复14步,直到5位十进制数处理完,2.4.4循环程序,DATA SEGMENT ADEC DB 30H,31H,33H,30H,38H;定义5位十进制数01308D COUNT EQU $-ADEC RESULT DW ? DATA ENDS STACK SEGMENT PARA STACKSTACK DB 10DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK TRDEC PROC FAR START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET

24、ADEC MOV CX,COUNT XOR AX,AX ;结果寄存器清0 AGAIN : ADD AX,AX;结果*2 MOV BX,AX ADD AX,AX ;结果*4 ADD AX,AX;结果*8 ADD AX,BX;结果*10 MOV BH,0 MOV BL,SI;取一位十进制数 SUB BX,30H ;转换成09 ADD AX,BX;并入结果 INC SI ;修改地址 LOOP AGAIN ;如未到5次,则继续 MOV RESULT ,AX;存放16位二进制结果 RET ;返回 TRDEC ENDP CODE ENDS END START,29,2.4汇编语言程序设计,多重循环程序 如

25、果一个循环的循环体内包含了另一个循环,称这个循环为多重环。 多重结构的循环程序设计的基本方法与单重循环程序设计是一致的,应分别考虑各重循环的控制条件及其程序实现。需要特别注意的是,在每次通过外层循环再次进入内层循环时,初始条件必须重新设置。,2.4.4循环程序,30,2.4汇编语言程序设计,2、例24-4-3 在数据区DATBUF中存放着一组数据,数据的个数是N,要求对该数据区中的数据按递增关系排序。 算法分析: :解决这个问题通常采用冒泡排序法。从第一个数开始依次对相临的两个数两两进行比较,如果次序正确则不做任何操作,否则就将两个数交换位置。这样,在做了第一遍的N-1次比较后,最大的数已经放

26、在了最后,因此,第二遍比较只需要考虑N-1个数的排序,需要做N-2次比较;第三遍需做N-3次比较,总共要进行N-1次比较才能完成排序。 假设有5 个数: 22,34,56,78,12 22,34,56, 12, 78 22,34, 12 ,56 ,78 22,12, 34, 56 ,78 12, 22, 34, 56 ,78,2.4.4循环程序,31,2.4汇编语言程序设计,多重循环程序 在很多情况下,数组可能在比较遍数并未达到N-1遍就已经整序完毕,而程序仍然要继续运行到N-1遍才能结束。 为了提高效率,可以设立一个交换标志位,其初值为1。 在进入外循环后,我们首先判断交换标志位,如果为1,

27、则设置内循环的初始条件,进入内循环,在内循环中,如果交换过数据次序,则将交换标志置1,否则置0;如果为0,说明在内循环过程中,没有交换数据的次序,即数据已按要求排序,可以结束程序。 假设有5 个数: 22,34,12,56,78 22,12, 34 ,56 ,78 12,22, 34, 56 ,78,2.4.4循环程序,32,2.4汇编语言程序设计,程序流程图: 假设有5 个数:22,34,56,12,78 一、小循环 1、22与34比较, 2212,交换位置。 22,34,12,56,78 打一标志。 4、56与78比较,5678,不交换位置。 二、大循环 判断是否有交换标志? 1、有:设置

28、内循环初始条件重新进入内循环。 2、无: 说明已排好顺序12,22,34,56,78 结束程序。,2.4.4循环程序,33,2.4汇编语言程序设计,2.4.4循环程序,STAK SEGMENT PARA STACK STACK DB 10 DUP(0) STAK ENDS DATA SEGMENT DATBUF DB 22, 35, 18, 54, 10, 88 ;共N个数据,这里给出的是一组随机数 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA, SS : STAK START: MOV AX,DATA MOV DS,AX MOV CX,N ;要排

29、序的数据个数送CX DEC CX ;外循环计数指针,循环比较N-1遍 MOV BL,1 ;设置交换标志,初值为1 LOOP1: CMP BL,0 JZ DONE ;交换标志为0,说明已排序完毕 PUSH CX ;进入内循环之前,保存外循环计数值 MOV BL,0 ;设置进入内循环的初始条件 MOV SI,OFFSET DATBUF ;SI指向DATBUF首地址 LOOP2: MOV AL,SI CMP AL,SI+1 ;相临两数比较 JNA NEXT ;不大于则转下一个 XCHG AL,SI+1 ;否则,交换位置 MOV SI,AL MOV BL,1 ;数据交换后,交换标志置1 NEXT: I

30、NC SI ;修正数的位置,为下一次比较作准备 LOOP LOOP2 POP CX ;恢复外循环计数值 LOOP LOOP1 DONE: MOV AH,4CH INT 21H CODE ENDS END START,34,2.4汇编语言程序设计,子过程及过程定义 子程序 子程序是完成确定功能的独立的程序段,它可以被其他程序调用,在完成确定功能后,又可自动返回到调用程序处。 使用子程序的优缺点: 避免了程序中多次重复的书写程序,节省了内存空间; 由于一些常用的子程序可以事先编好,一旦需要时可以随时调用,因而也方便了程序的编制和调试。 但子程序的调用和返回需要占用时间,并且子程序通常具有一定的通用

31、性和独立性,因此在调用时,需要保存某些寄存器的内容,以防止子程序运行过程中破坏调用程序已产生的中间结果,所以子程序在运行时间上将有所损失。,2.4.5子过程及过程定义,35,2.4汇编语言程序设计,调用子程序的程序通常称为主程序 主程序在调用子程序时,应为子程序提供运算所需的初始数据;而子程序返回时,应将运算结果以一定的方式提交给主程序,通常称为主程序与子程序之间的参数传递。,2.4.5子过程及过程定义,36,2.4汇编语言程序设计,过程定义 用PROC和ENDP伪指令定义过程,格式为: 过程名PROC类型 RET 过程名ENDP 过程的执行是由调用指令CALL调用后进行的,调用FAR类型的过

32、程执行段间调用操作,而调用NEAR类型的过程执行段内调用操作。 返回指令执行段内返回还是段间返回与过程的类型有关,若类型为FAR,其相应的返回指令执行段间返回操作;若类型为NEAR,那么,其返回指令执行段内返回操作。,2.4.5子过程及过程定义,37,2.4汇编语言程序设计,子程序的调用和返回 1、段内调用和返回 调用程序和子程序在同一个代码段的程序结构. 注意:其中主程序,子程序名自已起.程序结束伪指令END后必须跟主程序名,2.4.5子过程及过程定义,CODE SEGMENT MAIN PROC FAR ;定义MAIN主过程 CALL SUB1;段内调用子程序SUB1 RET MAIN E

33、NDP SUB1 PROC NEAR ;定义SUB1段内调用子程序 RET SUB1 ENDP CODE ENDS END MAIN,38,2.4汇编语言程序设计,子程序的调用和返回 2、段间调用和返回 调用程序和子程序在不同的代码段的程序结构. 注意:由于SUB2既被段间调用又被段内调用,所以必须定义为FAR属性,另外程序结束伪指令END后必须跟主程序名.,2.4.5子过程及过程定义,CODE1 SEGMENT MAIN PROC FAR ;定义MAIN主过程 CALL FAR PTR SUB2 RET MAIN ENDP CODE1 ENDS CODE2 SEGMENT SUB1 PROC

34、 FAR ;定义SUB1段间调用子程序 CALL FAR PTR SUB2 RET SUB1 ENDP SUB2 PROC FAR ;定义SUB2段间调用子程序 RET SUB2 ENDP CODE2 ENDS END MAIN,39,2.4汇编语言程序设计,主程序与子程序之间的参数传递 主程序在调用子程序之前需要将某些初始数据提交给子程序,而子程序运行结束后也需将结果返回主程序,这就是两者之间的参数传递; 主程序给子程序提供的初始数据或获得初始数据的信息称为子程序的入口参数; 子程序返回主程序的结果常称为子程序的出口参数。,2.4.5子过程及过程定义,40,2.4汇编语言程序设计,主程序与子

35、程序之间的参数传递 寄存器传递参数方式 寄存器传递参数方式是指子程序的入口参数和出口参数都是通过寄存器传递的。适用于参数较少的情况,传递速度较快. 例2-4-5-1 CODE1SEGMENT MOV AL, BCDBUFF ;读取待转换的压缩BCD码到AL CALL FAR PTR BCD2 ;调BCD2子程序 CODE1 ENDS,2.4.5子过程及过程定义,41,2.4汇编语言程序设计,;名称:BCD2 ;功能:将一个字节的压缩BCD码转换成二进制数 ;所用寄存器:CX ;入口参数:AL存放两位BCD码 ;出口参数:AL存放二进制数 ;调用其它子程序;无 ;* CODE2SEGMENT A

36、SSUME CS: CODE2 BCD2 PROC FAR PUSH CX ;保护现场 MOV CH, AL ;AL中是一字节的BCD码.(入口参数) AND CH, 0FH ;存低8位 (保留个位,在CH中) MOV CL, 4 SHR AL, CL ;高8位右移4位 MOV CL, 10 MUL CL ; 高8位右移4位后乘10 (AX=AL*CL) ADD AL, CH ;高8位右移4位后乘10加低8位 ;(AL=BCD高*10+BCD低) POP CX ;恢复现场 RET BCD2 ENDP CODE2 ENDS,2.4.5子过程及过程定义,42,2.4汇编语言程序设计,2.4.5子过

37、程及过程定义,例如4-4-5-2寄存器传递参数. 求数组ARRAY中所有元素之和(65535)并存于SUM单元中. STAK SEGMENT PARA STACK STACK DB 100 DUP(?) STAK ENDS DATA SEGMENT ARRAY DB 1, 2, 3, 4, 5,6,7,8,9,10,11,12,13,14,15,16 COUNT EQU $-ARRAY SUM DW ? DATA ENDS CODE SEGMENT ASSUM CS:CODE, DS:DATA,SS:STAK START: MOV AX, DATA MOV DS, AX LEA SI, ARR

38、AY; 入口参数准备,将需要传递的参数送入寄存器 MOV CX, COUNT CALL SUM1 ;调用子程序求和,返回值在AX中 MOV SUM, AX ;和存于SUM单元 MOV AH, 4CH ;返回DOS INT 21H,43,2.4汇编语言程序设计,2.4.5子过程及过程定义,;名称:SUM1 ;功能:求字节数组和. ;所用寄存器:AX,CX,SI ;入口参数:SI=数组首址,CX=数组长度 ;出口参数:AX=数组和 ;调用其它子程序;无 ;* SUM1 PROC NEAR MOV AX , 0 ;数组和通过AX寄存器回送到主程序 AGAIN: ADD AL, SI ADC AH,

39、0 INC SI LOOP AGAIN RET SUM1 ENDP CODE ENDS END START,44,2.4汇编语言程序设计,指定内存单元参数传递方式 参数直接通过内存单元传递。 主程序在调用前应将子程序中所用的数据送入指定数据区,所需结果也从指定数据区中取。 在进入子程序后,子程序则直接从指定数据区中取数据和存放结果。此时,子程序必须指出它所用的指定内存区的段及有关变量。 当子程序中所用的数据量比较大时,调用前数据转移的工作量就比较大,因此指定内存单元传递参数的另一种方法是分别在指定单元中存放数据的首地址和数据长度,而不是数据本身。,2.4.5子过程及过程定义,45,2.4汇编语

40、言程序设计,指定内存单元参数传递方式 例:2-4-5-3数据段定义二个数组,编写程序实现数组段分别求和(不计益出). 本例是通过存储器来传递参数的,需要传递的数组的数保留在存储器中,调用前只需将数组偏移地址放入SI寄存器,在过程中通过寄存器间址就可取得存储器中的操作数,运算结果直接由过程写回到存储器中,回送给调用程序.,2.4.5子过程及过程定义,46,2.4汇编语言程序设计,例:2-4-5-3数据段定义二个数组,编写程序实现数组段分别求和(不计益出). DATA SEGMENT ARY1 DW 100 DUP(45) ;定义数组1 SUM1 DW ? ARY2 DW 100 DUP(33)

41、;定义数组2 SUM2 DW ? DATA ENDS STAK SEGMENT STACK SA DW 50 DUP(?) TOP LABEL WORD STAK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STAK START: MOV AX , DATA MOV DS, AX MOV AX, STAK MOV SS, AX MOV SP ,OFFSET TOP LEA SI, ARY1 ;数组1首地址,入口参数 MOV CX, LENGTH ARY1 ;数组1长度,入口参数 CALL SUM ;调用求和子程序 LEA SI, ARY2 ;数组

42、2首地址,入口参数 MOV CX, LENGTH ARY2 ;数组2长度,入口参数 ; (注意:LENGTH返回存储区必须用DUP()来定义,否则返回1.) CALL SUM ;调用求和子程序 MOV AH, 4CH INT 21H,2.4.5子过程及过程定义,47,2.4汇编语言程序设计,;名称:SUM ;功能:求数组和. ;所用寄存器:AX, SI ;入口参数:SI=数组首址, ;出口参数:AX=数组和 ;调用其它子程序;无 ;* SUM PROC NEAR ;子程序 XOR AX, AX ;AX清0 L1: ADD AX,WORD PTR SI ;加数组元素 INC SI INC SI

43、LOOP L1 MOV WORD PTR SI ,AX ;数组和送入SUM? RET SUM ENDP CODE ENDS END START,2.4.5子过程及过程定义,48,2.4汇编语言程序设计,堆栈传递参数方式 堆栈传递参数方式是指子程序的入口参数和出口参数是通过堆栈传递 。 主程序在调用子程序之前应将需传送给子程序的参数压入堆栈,子程序则从堆栈中取出参数,经过运算后,将运算结果也压入堆栈中;返回后,主程序在从堆栈中取出结果。 主程序压入参数的顺序与子程序传递结果的方式必须事先约定。,2.4.5子过程及过程定义,49,2.4汇编语言程序设计,堆栈传递参数方式 例:2-4-5-4通过堆栈传递参数实现数组求和并存入SUM单元中,要求主程序和子程序不在同一个代码段中,要进行段间调用. STAK SEGMENT PARA STACK STACK DB 100 DUP(?) TOP LABEL WORD STAK ENDS DATA SEGMENT ARRAY DW d1,d2,d3.,dn COUNT DW N SUM DW ? DATA ENDS,2.4.5子过程及过程定义,50,2.4汇编语言程序设计,堆栈传递参数方式 CODE1 SEGMENT ASSUME CS:COD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论