《计原及汇编》PPT课件.ppt

上传人:牧羊曲112 文档编号:5644875 上传时间:2023-08-05 格式:PPT 页数:84 大小:393KB
返回 下载 相关 举报
《计原及汇编》PPT课件.ppt_第1页
第1页 / 共84页
《计原及汇编》PPT课件.ppt_第2页
第2页 / 共84页
《计原及汇编》PPT课件.ppt_第3页
第3页 / 共84页
《计原及汇编》PPT课件.ppt_第4页
第4页 / 共84页
《计原及汇编》PPT课件.ppt_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《《计原及汇编》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《计原及汇编》PPT课件.ppt(84页珍藏版)》请在三一办公上搜索。

1、一、程序设计步骤1、分析问题,确定算法。2、画出程序流程3、正确、合理使用存储器和寄存器。4、编写程序。5、调试程序。,第9章 分支程序设计,顺序程序结构,第9章 分支程序设计,Z=10*(X+Y),;设置数据段DATA SEGMENT X DW 20H;变量X Y DW 12H;变量Y Z DW?;变量ZDATA ENDS;设置堆栈段STACK1 SEGMENT PARA STACK DB 10H DUP(0)STACK1 ENDS;设置代码段CODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AX,X ADD

2、AX,Y,SAL AX,1 MOV BX,AX MOV CL,2 SAL AX,CL ADD AX,BX MOV Y,AX MOV AH,4CH INT 21HCODE ENDS END START,二、分支程序设计,短转移:(RD1127或RD2-128)JMPSHORT TARGET,1、无条件转移:JMP 目标,(1)直接寻址方式,段内转移,JMP TARGET,COSEG1 SEGMENT COSEG2 SEGMENTTARGET:JMP FAR PTR TARGETCOSEG1 ENDS COSEG2 ENDS,段内转移:JMPCX JMPWORD PTR BX 或 JMPBX段间转

3、移:JMPDWORD PTR BX,1、无条件转移:JMP 目标,(2)间接寻址方式,段间转移,2、条件转移,JXX 目标,条件转移指令及其判断条件,条件转移指令及其判断条件,分支程序设计举例1、两分支程序设计方法2、多分支程序设计方法,(1)条件转移法(2)地址表法(3)跳转表,二、分支程序设计,程序如下:TESTDA1,01H JENEXT INC DA1NEXT:,试编制一程序段,把DA1字节单元中数据变为偶数。,两分支程序设计方法,试编制一程序,实现两个存储区之间的数据传送。,两分支程序设计方法,源程序如下:DATA SEGMENT ORG 20HSTRING1 DB 5 DUP(AS

4、SEMBLE LANGUAGE IS USEFUL)ORG$+20H ADDR1 DW STRING1+10H;源空间首地址 ADDR2 DW STRING1+2;目的空间首地址 COUNT DW 10H;待传送字节数DATA ENDSSTACK1 SEGMENT PARA STACK DB 30H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV SI,ADDR1;将源空间的首地址存入SI寄存器中 MOV DI,ADDR2;将目的空间的首地址存入DI寄存器中 MOV CX,C

5、OUNT;将传送的字节数存入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 FLAG3FLAG2:MOV AL,SI;本段程序实现从末地址开始传数 MOV DI,AL INC SI INC DI DEC CX JNE FLAG2FLAG3:MOV AH,4CH IN

6、T 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 THIS GAME,0AH,0DH,$STRING3 DB COMPUTER SCIENCE,0AH,0DH,$STRING4 DB ASSEMBLE LANGUAGE,0AH,0DH,$STRI

7、NG5 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,DEC AL SHL AL,1 MOV SI,AX MOV BX,ADDRESSTABSI;取转移的入口地址 JMP BX;跳转到对应的分支处理程序 FLAG1:MOV DX,OFFSET STRING1 JMP SHOW FLAG2

8、: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,多分支程序设计方法,3、跳转表法,实现程序如下:DATA SEGMENT NUM DB 2 STRING1 DB HELLO WORLD!,0AH,0DH,$STRING2 DB I LO

9、VE THIS 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,DEC AL MOV BL,AL

10、 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 STRING1 JMP SHOW FLAG2:MOV DX,OFFSET STRING2 JMP SHOW,FLAG3:MOV DX,OFFSET STRING3 JMP SHOWFLAG4:MOV DX,OFFSET STRING4 JMP SHOWFLAG5:MOV DX,OFFSET STRING5 JMP SHOW SHOW:MOV

11、 AH,09H INT 21H MOV AH,4CH INT 21H CODE ENDS END START,第10章 循环程序设计,一、循环程序基本结构,循环程序结构,1、初始化部分设置地址指针、计数器初值2、工作部分3、修改部分4、控制部分用计数控制循环用条件控制循环5、结束处理部分,第10章 循环程序设计,二、循环控制方法,1、用计数控制循环使用计数器,达到计数器预定值,循环结束。要求循环次数已知。计数器可以递增、递减可以选用寄存器、也可用存储单元,第10章 循环程序设计,用正计数法,计算数组ARRAY所有单元的和,DATA SEGMENT ARRAY DB 1,2,3,4,5,6,7,

12、8,9,10 COUNT EQU$-ARRAY SUM DW?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 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;如果小于

13、,继续循环 MOV BYTE PTR SUM,AL;将累计和存入变量 MOV AH,4CH INT 21H CODE ENDS END START,2、用条件控制循环找出一个终止循环的条件,每循环一次,对条件进行一次检测。满足终止循环的条件,退出循环,否则继续。通常选用条件转移指令来控制循环是否结束。,二、循环控制方法,第10章 循环程序设计,编写程序,求解兔子繁殖问题,给出到指定只兔子数时,需要多少个月。,实现程序如下:DATA SEGMENT RABBITNUM DW 650;存放兔子只数 MONTHNUM DB?;存放月数 DATA ENDS STACK1 SEGMENT PARA ST

14、ACK DW 20H DUP(?)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA 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 COD

15、E ENDS END START,1、内循环必须完整地包含在外循环内,二者不可以相互交叉。2、当从外循环再次进入内循环时,内循环的初始条件要重新设置。3、一个外循环中可以包含多个内循环,这些内循环可以嵌套,也可以并列存在。4、当内外循环都采用CX寄存器作为计数器时,由外循环进入内循环时,要保留外循环的次数,可以通过压入堆栈、存入其它寄存器或存储器中实现。5、当外层循环要求内层循环在不同条件下重复执行时,外循环中应该包括对内循环部分参数的修改部分。,三、多重循环程序设计,第10章 循环程序设计,DATA SEGMENT MULTABLE DB 9*9 DUP(0)DATA ENDS STACK1

16、 SEGMENT PARA STACK DW 20H DUP(?)STACK1 ENDS CODE SEGMENT ASSUME 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 MO

17、V MULTABLEDI,AL;将AL存入乘法表中 INC DI;修改乘法表指针 LOOP INNERLOP;内循环控制语句 POP CX;恢复外循环次数 LOOP OUTERLOP;外循环控制语句 MOV AH,4CH INT 21H CODE ENDS END START,第11章 子程序设计,子程序的适应范围:(1)多次重复使用的程序段。如程序中多次出现的数值转换、码值转换等(2)具有特殊功能的程序段。如求解某一问题时,涉及到的复杂的数学计算,以及排序或查找等一些需要用到的算法问题。(3)具有通用性的程序段。如一些对文件的操作,字符串的操作等(4)中断服务程序。(5)系统调用程序。如DO

18、S调用,BIOS调用等。,重点,过程定义过程调用过程返回,程序结构,过程主调过程(主程序)被调过程(子程序),第11章 子程序设计,过程定义,过程名PROC类型语句语句过程名ENDP,NEARFAR,第11章 子程序设计,过程调用,CALL 过程名,返回地址入栈转移到(过程名所代表的)入口地址,段内,段间,CALL INPUTCALL BXCALL WORD PTR BX,CALL FAR PTR INPUTCALL OUTPUTCALL DWORD PTR BX,第11章 子程序设计,过程返回,RET,过程返回地址从栈中弹出到 IP(CS)中返回原来的调用点,段内,段间,返回指令,段内,段间

19、,带立即数返回指令,RET,RET n,第11章 子程序设计,子程序设计方法,1、适度地划分并确定子程序功能具有独立功能的程序作为一个模块多次出现的程序段独立出来2、选择适当的参量传递途径3、信息的保存4、编写子程序的文字说明,(1)在调用程序中保存信息,:PUSHPUSHPUSHCALLPOPPOPPOP:,AXBXCXSUB_PROCCXBXAX,;保存信息;调用子程序;恢复信息,信息的保存,(2)在子程序中保存信息,SUB_PTOC1SUB_PROC1,PROCPUSH BXPUSH CXPUSH SIPUSH BP:POP BPPOP SIPOP CXPOP BXRETENDP,子程序

20、功能的指令序列,信息的保存,编写子程序的文字说明,(1)子程序名。(2)子程序的功能描述。(3)子程序的入口参数和出口参数。(4)子程序中使用了哪些寄存器、存储单元。(5)子程序中是否调用其他子程序。,第11章 子程序设计,参数传递,用寄存器传递适合参数较少情况 用参数表传递适合参数较多情况 用堆栈传递适合参数多情况,第11章 子程序设计,UPTOLW PROC PUSHF CMP AL,A JB UP1 CMP AL,Z JA UP1 ADD AL,a-AUP1:POPF RETUPTOLW ENDP,把大写字母改为小写字母,;子程序名:UPTOLW;功能:大写转换小写;入口参数:AL=待转

21、字符;出口参数:AL中放转换完字符,MOV AL,RCALL UPTOLWMOV 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 AX,DATA MOV DS,AX MOV CX,COUNT MO

22、V 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:SUB AX,DX;进行减奇数 JB EXIT;如果不够减,结束 INC BL;够减,B

23、L加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 ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:

24、MOV AX,DATA MOV DS,AX MOV CX,COUNT,过程调用存储单元,MOV SI,0 MOV DI,0NEXT:MOV AX,ARRAYSI;从数组中依次取出被开方数 MOV RADICAND,AX CALL GETSQRT;调用子程序求平方根 MOV BL,SQUA_ROOT;将平方根存入ROOT数组中 MOV ROOTDI,BL ADD SI,2;修改指针,指向下一个被开方数 INC DI;修改指针,用于存放下一个平方根 LOOP NEXT MOV AH,4CH INT 21H GETSQRT PROC PUSH AX;将子程序中用到的寄存器入栈保护 PUSH DX,过

25、程调用存储单元,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,40COUNT DW 100SUM DW?TAB DW 3 DUP(?),MOV TAB,OFFSET ARYMOV TAB+2,OFFSET COUNTMOV TAB+4,O

26、FFSET SUMLEA BX,TABCALL PADDMOV DX,SUM.,PADD PROC MOV SI,BX MOV DI,BX+2 MOV CX,DI MOV DI,BX+4 XOR AX,AXL:ADD AX,SI ADD SI,2 LOOP L MOV DI,AX RETPADD ENDP,过程调用参数表传递,利用地址表传递参数,实现数组ARRAY单元的累加。,DATA SEGMENT ARRAY DW 21,22,23,24,25,26,27 COUNT DW($-ARRAY)/2 RESULT DW?ADDRESS DW 3 DUP(0);定义地址表DATA ENDSSTA

27、CK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX,利用地址表传递参数,实现数组ARRAY单元的累加。,MOV ADDRESS,OFFSET ARRAY;将ARRAY的地址存入地址表MOV ADDRESS+2,OFFSET COUNT;将COUNT的地址存入地址表MOV ADDRESS+4,OFFSET RESULT;将RESULT的地址存入地址表MOV BX,OFFSET ADDRESS;将地址表的地址装入BXCALL SUM

28、_PROC;调用求和子程序MOV AH,4CHINT 21HSUM_PROC PROCPUSH AX;将子程序中用到的寄存器入栈保护PUSH BXPUSH SIPUSH DIMOV SI,BX;将ARRAY的地址取出,存入SIMOV DI,BX+2;将COUNT的地址取出,存入DIMOV CX,DI;将COUNT的内容取出,存入CX作为计数器MOV DI,BX+4;将RESULT的地址取出,存入DI,利用地址表传递参数,实现数组ARRAY单元的累加。,XOR AX,AX;AX寄存器初始化 LOP:ADD AX,SI;累加 ADD SI,2;修改指针,移到下一单元 LOOP LOP MOV DI

29、,AX;将结果保存到RESULT中 POP DI;恢复寄存器 POP SI POP CX POP AX RET ENDP ENDS END START,过程调用用栈传递参数,在主调程序中压入参数参数和返回地址在栈中的位置在被调过程中读取参数在主调程序中读取返回的参数,用栈传递参数处理要点,压入参数CALL从栈中弹出压入的参数,用BP间址方式取出参数处理RET,主调程序,被调过程,参数压入顺序与取出顺序相反参数的个数和类型按事先约定存取调用结束时,从栈中清除压入的参数,利用堆栈传递参数,实现数组ARRAY单元的累加。,DATA SEGMENT ARRAY DW 21,22,23,24,25,26

30、,27 COUNT DW($-ARRAY)/2 RESULT DW?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: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

31、 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;将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

32、6 ENDP ENDS END START,系统功能调用由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。,第12章 系统功能调用,系统功能调用,采用软中断指令 INT n(其中:n为中断类型码)(1)PUSHF,TF、IF清0,CS、IP入栈(2)按中断类型码n,从中断向量表对应位置取出将要调用的功能子程序的入口地址CS,IP(3)功能子程序返回:IRET,DOS功能调用,调用方法:入口参数 子程序编号送AH INT 21H,DOS功能调用,基本I/O功能调用,(1)从键盘输入一个字符(功能号=

33、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

34、,2 INT 21H,DOS功能调用,(4)MOV DL,0FFH;键盘输入 MOV AH,6 INT 21H MOV DL,24H;屏幕输出 MOV AH,6 INT 21H,DOS功能调用,(5)显示字符串(功能号=9)LEA DX,MOV AH,9 INT 21H注意:被显示的字符串必须以$结束。,DOS功能调用,DATA SEGMENT BUF DB HOW DO YOU DO?$.DATA ENDS.MOV AX,DATAMOV DS,AX.MOV DX,OFFSET BUFMOV AH,9INT 21H.,例:显示一字符串,(6)输入字符串(功能号=0AH)此功能调用从键盘输入一串

35、字符并把它存入用户指定的缓冲区中。LEA DX,MOV AH,0AHINT 21H,DOS功能调用,N1:缓冲区长度(最大键入字符数)N2:实际键入的字符数(不包括回车符),用户定义的输入字符串的缓冲区格式,DATA SEGMENT BUF DB 10;缓冲区长度 DB?;实际输入个数 DB 10 DUP(?);存储空间DATA ENDS.MOV AX,DATAMOV DS,AX.LEA DX,BUFMOV AH,10INT 21H.,例:输入字符串,DOS功能调用,基本I/O功能调用,MOV CX,1999MOV DH,5MOV DL,20MOV AH,2BH;设置日期INT 21H,MOV

36、 AH,2AH;取得日期INT 21H;cx:dxMOV YEAR,CXMOV MONTH,DHMOV DAY,DL,DOS功能调用,(7)设置/读出日期,MOV CX,090FHMOV DX,0200HMOV AH,2DH;设置时间INT 21H;9点15分2秒,MOV AH,2CH;取得时间INT 21H;cx:dxMOV HOURS,CXMOV MINUTES,DHMOV SECOND,DL,DOS功能调用,(8)设置/读出时间,BIOS功能调用,BIOS调用通过多个软中断提供,调用方法为:MOV AH,INT BIOS中的几个主要中断类型如下:INT 10H屏幕显示INT 13H磁盘操作INT 14H串行口操作INT 16H键盘操作INT 17H打印机操作每类中断由包含许多子功能,调用时通过功能号指定。,BIOS功能调用,键盘输入16H号功能调用,功能 出口参数 说明 AH=0 AL=字符的ASCII码从键盘读一个字符 AH=1 ZF=1表示无键可读判键盘是否有键可读 ZF=0表示有键可读AH=2 AL=功能键状态字节取特殊功能键当前状态,BIOS功能调用,打印输出17H号功能调用,BIOS功能调用,显示输出10H号功能调用,BIOS功能调用,显示输出10H号功能调用,第13章 汇编语言程序的开发与调试,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号