版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、程序设计步骤 1、分析问题,确定算法。 2、画出程序流程 3、正确、合理使用存储器和寄存器。 4、编写程序。 5、调试程序。,第9章 分支程序设计,顺序程序结构,第9章 分支程序设计,Z=10*(X+Y),;设置数据段 DATA SEGMENT X DW 20H ;变量X Y DW 12H ;变量Y Z DW ? ;变量Z DATA ENDS ;设置堆栈段 STACK1 SEGMENT PARA STACK DB 10H DUP(0) STACK1 ENDS ;设置代码段 CODE SEGMENT ASSUME CS: CODE, DS:DATA START: MOV AX, DATA M
2、OV DS, AX MOV AX, X ADD AX, Y,SAL AX, 1 MOV BX, AX MOV CL, 2 SAL AX, CL ADD AX, BX MOV Y, AX MOV AH, 4CH INT 21H CODE ENDS END START,二、分支程序设计,短转移:(RD1127或RD2-128) JMPSHORT TARGET,1、无条件转移: JMP 目标,(1)直接寻址方式,段内转移,JMP TARGET,COSEG1 SEGMENT COSEG2 SEGMENT TARGET: JMP FAR PTR TARGET COSEG1 ENDS COSEG2 END
3、S,段内转移:JMPCX JMPWORD PTR BX 或 JMPBX 段间转移:JMPDWORD PTR BX,1、无条件转移: JMP 目标,(2)间接寻址方式,段间转移,2、条件转移,JXX 目标,条件转移指令及其判断条件,条件转移指令及其判断条件,分支程序设计举例1、两分支程序设计方法2、多分支程序设计方法,(1)条件转移法 (2)地址表法 (3)跳转表,二、分支程序设计,程序如下: TESTDA1,01H JENEXT INC DA1 NEXT: ,试编制一程序段,把DA1字节单元中数据变为偶数。,两分支程序设计方法,试编制一程序,实现两个存储区之间的数据传送。,两分支程序设计方法,
4、源程序如下: DATA SEGMENT ORG 20H STRING1 DB 5 DUP( ASSEMBLE LANGUAGE IS USEFUL) ORG $+20H ADDR1 DW STRING1+10H ;源空间首地址 ADDR2 DW STRING1+2 ;目的空间首地址 COUNT DW 10H ;待传送字节数 DATA ENDS STACK1 SEGMENT PARA STACK DB 30H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV SI,
5、 ADDR1 ;将源空间的首地址存入SI寄存器中 MOV DI, ADDR2 ;将目的空间的首地址存入DI寄存器中 MOV CX, COUNT ;将传送的字节数存入CX寄存器中 CMP SI, DI ;将源空间与目的空间的首地址 JA FLAG2 ;如果源空间首地址大,从首地址开始传数,跳转相应程序 ADD SI, CX ;如果目的空间首地址大,需从末地址开始,形成末地址 ADD DI, CX,FLAG1: MOV AL, SI-1 ;本段程序实现从首地址开始传数 MOV DI-1, AL DEC SI DEC DI DEC CX JNE FLAG1 JMP FLAG3 FLAG2: MOV
6、AL, SI ;本段程序实现从末地址开始传数 MOV DI, AL INC SI INC DI DEC CX JNE FLAG2 FLAG3: MOV AH, 4CH INT 21H CODE ENDS END START,1、条件转移法,多分支程序设计方法,多分支程序设计方法,2、地址表法,入口地址=地址表首地址+(参数-1)2,实现程序如下: DATA SEGMENT NUM DB 4 ADDRTAB DW FLAG1, FLAG2, FLAG3, FLAG4, FLAG5 STRING1 DB HELLO WORLD!, 0AH, 0DH, $ STRING2 DB I LOVE THI
7、S GAME, 0AH, 0DH, $ STRING3 DB COMPUTER SCIENCE, 0AH, 0DH, $ STRING4 DB ASSEMBLE LANGUAGE, 0AH, 0DH, $ STRING5 DB COMPUTER ORGANIZATION, 0AH, 0DH, $ DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV AH,0 MOV AL, NUM
8、,DEC AL SHL AL,1 MOV SI, AX MOV BX, ADDRESSTABSI ;取转移的入口地址 JMP BX ;跳转到对应的分支处理程序 FLAG1: MOV DX, OFFSET STRING1 JMP SHOW FLAG2: MOV DX, OFFSET STRING2 JMP SHOW FLAG3: MOV DX, OFFSET STRING3 JMP SHOW FLAG4: MOV DX, OFFSET STRING4 JMP SHOW FLAG5: MOV DX, OFFSET STRING5 JMP SHOW SHOW: MOV AH, 09H INT 21H
9、 MOV AH, 4CH INT 21H CODE ENDS END START,多分支程序设计方法,3、跳转表法,实现程序如下: DATA SEGMENT NUM DB 2 STRING1 DB HELLO WORLD!, 0AH, 0DH, $ STRING2 DB I LOVE THIS GAME, 0AH, 0DH, $ STRING3 DB COMPUTER SCIENCE, 0AH, 0DH, $ STRING4 DB ASSEMBLE LANGUAGE, 0AH, 0DH, $ STRING5 DB COMPUTER ORGANIZATION, 0AH, 0DH, $ DATA
10、ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV AH,0 MOV AL, NUM,DEC AL MOV BL,AL SHL AL,1 ADD AL,BL ADD AX, OFFSET JUMP_TAB JMP AX JUMP_TAB: JMP FLAG1 JMP FLAG2 JMP FLAG3 JMP FLAG4 JMP FLAG5 FLAG1: MOV DX, OFFSET STRI
11、NG1 JMP SHOW FLAG2: MOV DX, OFFSET STRING2 JMP SHOW,FLAG3: MOV DX, OFFSET STRING3 JMP SHOW FLAG4: MOV DX, OFFSET STRING4 JMP SHOW FLAG5: MOV DX, OFFSET STRING5 JMP SHOW SHOW: MOV AH, 09H INT 21H MOV AH, 4CH INT 21H CODE ENDS END START,第10章 循环程序设计,一、循环程序基本结构,循环程序结构,1、初始化部分 设置地址指针、计数器初值 2、工作部分 3、修改部分
12、4、控制部分 用计数控制循环 用条件控制循环 5、结束处理部分,第10章 循环程序设计,二、循环控制方法,1、用计数控制循环 使用计数器,达到计数器预定值,循环结束。要求循环次数已知。 计数器可以递增、递减 可以选用寄存器、也可用存储单元,第10章 循环程序设计,用正计数法,计算数组ARRAY所有单元的和,DATA SEGMENT ARRAY DB 1,2,3,4,5,6,7,8,9,10 COUNT EQU $-ARRAY SUM DW ? DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT A
13、SSUME CS: CODE, DS:DATA START: MOV AX, DATA MOV DS, AX XOR AX,AX ;AX寄存器清0,累加用 MOV CX,0 ;计数器CX清0 MOV SI, 0 ;数组指针清0,NEXT: ADD AL,ARRAYSI ;数组累加 INC SI ;数组指针后移 INC CX ;计数器加1 CMP CX,COUNT ;计数器值与循环次数比较 JL NEXT ;如果小于,继续循环 MOV BYTE PTR SUM,AL ;将累计和存入变量 MOV AH, 4CH INT 21H CODE ENDS END START,2、用条件控制循环 找出一个终
14、止循环的条件,每循环一次,对条件进行一次检测。满足终止循环的条件,退出循环,否则继续。 通常选用条件转移指令来控制循环是否结束。,二、循环控制方法,第10章 循环程序设计,编写程序,求解兔子繁殖问题,给出到指定只兔子数时,需要多少个月。,实现程序如下: DATA SEGMENT RABBITNUM DW 650 ;存放兔子只数 MONTHNUM DB ? ;存放月数 DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP (?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DA
15、TA MOV DS, AX XOR CX,CX ;计数器清0 MOV AX,0 ;斐波那契数初始值 MOV BX,1,NEXT: XCHG AX,BX ADD AX,BX ;产生一个新的斐波那契数 INC CL ;计数器加1 CMP AX,RABBITNUM ;比较产生的新数与给定数 JAE RESULT ;如果大于或等于,结束 JMP NEXT ;小于,继续循环 RESULT: MOV MONTHNUM,CL MOV AH,4CH INT 21H CODE ENDS END START,1、内循环必须完整地包含在外循环内,二者不可以相互交叉。 2、当从外循环再次进入内循环时,内循环的初始条件
16、要重新设置。 3、一个外循环中可以包含多个内循环,这些内循环可以嵌套,也可以并列存在。 4、当内外循环都采用CX寄存器作为计数器时,由外循环进入内循环时,要保留外循环的次数,可以通过压入堆栈、存入其它寄存器或存储器中实现。 5、当外层循环要求内层循环在不同条件下重复执行时,外循环中应该包括对内循环部分参数的修改部分。,三、多重循环程序设计,第10章 循环程序设计,DATA SEGMENT MULTABLE DB 9*9 DUP(0) DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP (?) STACK1 ENDS CODE SEGMENT ASSUM
17、E CS:CODE,DS:DATA START: MOV AX,DATA MOV DS, AX MOV BH,0 ;将行号初值存入BH XOR DI, DI ;将乘法表的指针清0 MOV CX,9 ;外循环次数为9 OUTERLOP: PUSH CX ;将外循环次数入栈保护 INC BH ;行号加1 MOV BL,0 ;将列号初值存入BL MOV CX,9 ;内循环次数为9,INNERLOP:INC BL ;列号加1 MOV AL,BH ;将行号存入AL MUL BL ;将行号*列号存入AL MOV MULTABLEDI,AL ;将AL存入乘法表中 INC DI ;修改乘法表指针 LOOP I
18、NNERLOP ;内循环控制语句 POP CX ;恢复外循环次数 LOOP OUTERLOP ;外循环控制语句 MOV AH,4CH INT 21H CODE ENDS END START,第11章 子程序设计,子程序的适应范围: (1)多次重复使用的程序段。如程序中多次出现的数值转换、码值转换等 (2)具有特殊功能的程序段。如求解某一问题时,涉及到的复杂的数学计算,以及排序或查找等一些需要用到的算法问题。 (3)具有通用性的程序段。如一些对文件的操作,字符串的操作等 (4)中断服务程序。 (5)系统调用程序。如DOS调用,BIOS调用等。,重点,过程定义 过程调用 过程返回,程序结构,过程
19、主调过程(主程序) 被调过程(子程序),第11章 子程序设计,过程定义,过程名PROC类型 语句 语句 过程名ENDP,NEAR FAR,第11章 子程序设计,过程调用,CALL 过程名,返回地址入栈 转移到(过程名所代表的)入口地址,段内,段间,CALL INPUT CALL BX CALL WORD PTR BX,CALL FAR PTR INPUT CALL OUTPUT CALL DWORD PTR BX,第11章 子程序设计,过程返回,RET,过程返回地址从栈中弹出到 IP (CS)中 返回原来的调用点,段内,段间,返回指令,段内,段间,带立即数返回指令,RET,RET n,第11章
20、 子程序设计,子程序设计方法,1、适度地划分并确定子程序功能 具有独立功能的程序作为一个模块 多次出现的程序段独立出来 2、选择适当的参量传递途径 3、信息的保存 4、编写子程序的文字说明,(1)在调用程序中保存信息,: PUSH PUSH PUSH CALL POP POP POP :,AX BX CX SUB_PROC CX BX AX,;保存信息 ;调用子程序 ;恢复信息,信息的保存,(2)在子程序中保存信息,SUB_PTOC1 SUB_PROC1,PROC PUSH BX PUSH CX PUSH SI PUSH BP : : POP BP POP SI POP CX POP BX R
21、ET ENDP,子程序功能的指令序列,信息的保存,编写子程序的文字说明,(1)子程序名。 (2)子程序的功能描述。 (3)子程序的入口参数和出口参数。 (4)子程序中使用了哪些寄存器、存储单元。 (5)子程序中是否调用其他子程序。,第11章 子程序设计,参数传递,用寄存器传递适合参数较少情况 用参数表传递适合参数较多情况 用堆栈传递适合参数多情况,第11章 子程序设计,UPTOLW PROC PUSHF CMP AL, A JB UP1 CMP AL, Z JA UP1 ADD AL, a-A UP1: POPF RET UPTOLW ENDP,把大写字母改为小写字母,;子程序名:UPTOLW
22、 ;功能:大写转换小写 ;入口参数:AL=待转字符 ;出口参数:AL中放转换完字符,MOV AL, R CALL UPTOLW MOV DL, AL,过程调用寄存器传递,用减奇数法求平方根子程序流程,实现程序为: DATA SEGMENT ARRAY DW 8101,3600,2510,100 COUNT EQU($-ARRAY)/2 ROOT DB COUNT DUP(0) DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV A
23、X,DATA MOV DS,AX MOV CX,COUNT MOV SI,0 MOV DI,0 NEXT: MOV AX, ARRAYSI ;从数组中依次取出被开方数 CALL GETSQRT ;调用子程序求平方根,MOV ROOTDI,BL ;将平方根存入ROOT数组中 ADD SI,2 ;修改指针,指向下一个被开方数 INC DI ;修改指针,用于存放下一个平方根 LOOP NEXT MOV AH, 4CH INT 21H GETSQRT PROC PUSH AX ;将子程序中用到的寄存器入栈保护 PUSH DX MOV BL,0 ;平方根初始化 MOV DX,1 ;奇数初始化 SUB1:
24、 SUB AX, DX ;进行减奇数 JB EXIT ;如果不够减,结束 INC BL ;够减,BL加1 ADD DX,2 ;形成下一个奇数 JMP SUB1 EXIT: POP DX ;恢复寄存器 POP AX,RET ENDP ENDS END START,过程调用存储单元(同上题),DATA SEGMENT ARRAY DW 8101,3600,2510,100 COUNT EQU($-ARRAY)/2 ROOT DB COUNT DUP(0) RADICAND DW ? SQUA_ROOT DB ? DATA ENDS STACK1 SEGMENT PARA STACK DW 20H
25、DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,COUNT,过程调用存储单元,MOV SI,0 MOV DI,0 NEXT: MOV AX,ARRAYSI ;从数组中依次取出被开方数 MOV RADICAND,AX CALL GETSQRT ;调用子程序求平方根 MOV BL, SQUA_ROOT ;将平方根存入ROOT数组中 MOV ROOTDI,BL ADD SI,2 ;修改指针,指向下一个被开方数 INC DI ;修改指针,用于存放下一个平方根 LOOP
26、NEXT MOV AH,4CH INT 21H GETSQRT PROC PUSH AX ;将子程序中用到的寄存器入栈保护 PUSH DX,过程调用存储单元,MOV AX,RADICAND MOV SQUA_ROOT,0 ;平方根初始化 MOV DX,1 ;奇数初始化 SUB1: SUB AX,DX ;进行减奇数 JB EXIT ;如果不够减,结束 INC SQUA_ROOT ;够减,BL加1 ADD DX,2 ;形成下一个奇数 JMP SUB1 EXIT: POP DX ;恢复寄存器 POP AX RET ENDP ENDS END START,ARY DW -86, 420, 7, ,40
27、 COUNT DW 100 SUM DW ? TAB DW 3 DUP(?),MOV TAB, OFFSET ARY MOV TAB+2, OFFSET COUNT MOV TAB+4, OFFSET SUM LEA BX, TAB CALL PADD MOV DX, SUM .,PADD PROC MOV SI, BX MOV DI, BX+2 MOV CX, DI MOV DI, BX+4 XOR AX, AX L: ADD AX, SI ADD SI, 2 LOOP L MOV DI, AX RET PADD ENDP,过程调用参数表传递,利用地址表传递参数,实现数组ARRAY单元的累加
28、。,DATA SEGMENT ARRAY DW 21,22,23,24,25,26,27 COUNT DW ($-ARRAY)/2 RESULT DW ? ADDRESS DW 3 DUP(0) ;定义地址表 DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX,利用地址表传递参数,实现数组ARRAY单元的累加。,MOV ADDRESS, OFFSET ARRAY ;将ARRAY的地址存入地址表
29、MOV ADDRESS+2,OFFSET COUNT;将COUNT的地址存入地址表 MOV ADDRESS+4,OFFSET RESULT;将RESULT的地址存入地址表 MOV BX,OFFSET ADDRESS ;将地址表的地址装入BX CALL SUM_PROC ;调用求和子程序 MOV AH,4CH INT 21H SUM_PROC PROC PUSH AX ;将子程序中用到的寄存器入栈保护 PUSH BX PUSH SI PUSH DI MOV SI,BX ;将ARRAY的地址取出,存入SI MOV DI,BX+2 ;将COUNT的地址取出,存入DI MOV CX,DI ;将COUN
30、T的内容取出,存入CX作为计数器 MOV DI,BX+4 ;将RESULT的地址取出,存入DI,利用地址表传递参数,实现数组ARRAY单元的累加。,XOR AX,AX ;AX寄存器初始化 LOP: ADD AX,SI ;累加 ADD SI,2 ;修改指针,移到下一单元 LOOP LOP MOV DI,AX ;将结果保存到RESULT中 POP DI ;恢复寄存器 POP SI POP CX POP AX RET ENDP ENDS END START,过程调用用栈传递参数,在主调程序中压入参数 参数和返回地址在栈中的位置 在被调过程中读取参数 在主调程序中读取返回的参数,用栈传递参数处理要点,
31、压入参数 CALL 从栈中弹出压入的参数,用BP间址方式取出参数 处理 RET,主调程序,被调过程,参数压入顺序与取出顺序相反 参数的个数和类型按事先约定存取 调用结束时,从栈中清除压入的参数,利用堆栈传递参数,实现数组ARRAY单元的累加。,DATA SEGMENT ARRAY DW 21,22,23,24,25,26,27 COUNT DW ($-ARRAY)/2 RESULT DW ? DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA STAR
32、T: MOV AX,DATA MOV DS,AX MOV AX, OFFSET ARRAY ;将ARRAY的地址入栈 PUSH AX MOV AX,COUNT ;将COUNT入栈 PUSH AX MOV AX,OFFSET RESULT ;将RESULT的地址入栈,PUSH AX CALL SUM_PROC ;调用求和子程序 MOV AH,4CH INT 21H SUM_PROC PROC PUSH AX ;将子程序中用到的寄存器入栈保护 PUSH SI PUSH DI PUSH BP MOV BP,SP MOV SI,BP+14 ;将ARRAY的地址取出,存入SI MOV CX,BP+12
33、;将COUNT的内容取出,存入CX MOV DI,BP+10 ;将RESULT的地址取出,存入DI XOR AX,AX ;AX寄存器初始化 LOP: ADD AX,SI ;累加 ADD SI,2 ;修改指针,移到下一单元 LOOP LOP,MOV DI,AX ;将结果保存到RESULT中 POP BP POP DI ;恢复寄存器 POP SI POP AX RET 6 ENDP ENDS END START,系统功能调用由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。 系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。,第12章 系统功能调用,
34、系统功能调用,采用软中断指令 INT n (其中:n为中断类型码) (1)PUSHF,TF、IF清0,CS、IP入栈 (2)按中断类型码n,从中断向量表对应位置取出将要调用的功能子程序的入口地址CS,IP (3)功能子程序返回:IRET,DOS功能调用,调用方法: 入口参数 子程序编号送AH INT 21H,DOS功能调用,基本I/O功能调用,(1) 从键盘输入一个字符(功能号=1) MOV AH,1 ;等待按键 INT 21H ;字符回显 (2) 从键盘输入一个字符,无显示(功能号=8) MOV AH,8 INT 21H ,DOS功能调用,例:程序中有时需要用户对提示做出应答 GET_KEY: MOV AH,1;等待键入字符 INT 21H;结果在AL中 CMP AL,Y ;是Y? JZ YES ;是,转YES CMP AL,N ;是N? JZ NO ;是,转NO JMP GET_KEY;否则继续等待输入 YES: NO: ,(3) 在显示器上显示一个字符(功能号=2) MOV DL, MOV AH, 2 INT 21H 例:在显示器上显示一个字符A MOV DL, A ;或MOV DL, 41H MOV AH, 2 INT 21H,DOS功能调用,(4)MOV DL,0FFH;键盘输入 MOV AH,6 INT 21H MOV DL,24H;屏幕输出 MOV AH,6
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 26年银发鼻饲护理实操考核标准课件
- 医学26年:困有所助要点解读 查房课件
- 26年基因检测卡脖子技术突破要点
- 20XX中学教师师德演讲稿:用爱铸就希望
- 淘宝代运营职业规划指南
- 手抄报设计模板
- 产品经理就业指导计划
- 预防口腔宣教
- 煤炭销售协议2026年意向版
- 西式厨师中级试卷及答案
- 2026湖北神农架林区公安局招聘辅警22人备考题库完整参考答案详解
- 达州市2026年面向高校毕业生招聘园区产业发展服务专员(37人)笔试参考题库及答案解析
- 2025年江西大学生村官招录考试笔试试题及答案解析
- 2026广东惠州市惠城区桥东街道招聘党建联络员和村(社区)“两委”班子储备人选补充笔试备考题库及答案详解
- 第13课 辽宋夏金元时期的对外交流 课件
- 《预算执行常态化监督发现问题纠偏整改操作指南(试行)》
- 2026年“建安杯”信息通信建设行业安全竞赛核心考点题库
- T-CCSAS 062-2026《行为安全观察与沟通实施指南》
- 备战2026河南中考英语:补全对话7大场景高频问句及答语梳理+解题技巧
- 应急演练组织规范及流程
- 砖混转框架施工方案样本
评论
0/150
提交评论