《计原及汇编913》由会员分享,可在线阅读,更多相关《计原及汇编913(84页珍藏版)》请在金锄头文库上搜索。
1、一、程序设计步骤1、分析问题,确定算法。2、画出程序流程3、正确、合理使用存储器和寄存器。4、编写程序。5、调试程序。第9章 分支程序设计顺序程序结构指令1指令2指令n指令n+1 :第9章 分支程序设计将X中的数存入AX开始结束将AX左移1位存入BX将AX左移2位将AX存入Z将AX与BX相加存入AXX+Y存入AXZ=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)STACK
2、1 ENDS ;设置代码段设置代码段CODE SEGMENTASSUME CS: CODE, DS:DATASTART: MOV AX, DATA MOV 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 21HCODE ENDS END START二、分支程序设计判定条件分支程序1分支程序2判定条件分支程序YYNN单分支 双分支 判定条件分支程序1分支程序2分支程序n.条件1条件2条件n多分支 RD1 TARGET1:JMP TAR
3、GET1 TARGET2: RD2 JMP TARGET2(a)正向转移(b)负向转移段内转移的直接寻址方式短转移:(RD1127或RD2-128)JMPSHORT TARGET1、无条件转移: JMP 目标(1)直接寻址方式段内转移JMP TARGETCOSEG1 SEGMENT COSEG2 SEGMENTTARGET: JMP FAR PTR TARGETCOSEG1 ENDS COSEG2 ENDS段内转移:段内转移:JMPCX JMPWORD PTR BX 或或 JMPBX段间转移:段间转移:JMPDWORD PTR BX1、无条件转移: JMP 目标(2)间接寻址方式段间转移2 2
4、、条件转移、条件转移 RD3 NEXT1:JXX NEXT1 NEXT2: RD4 JXX NEXT2(a)正向转移(b)负向转移JXX 目标目标条件转移指令及其判断条件 1 0 1 0 1 0 1 0 1 0JOJNOJSJNSJZ/JEJNZ/JNEJP/JPEJNP/JPOJCJNC简单条件转移指令条件组合关系判断条件 OF SF ZF PF CF条件转移指令种类条件组合关系判断条件 OF SF ZF PF CF条件转移指令种类(a=b)AND ZF=0(a=b) OR ZF=1(ab)AND ZF=0(ab) OR ZF=0 a b 0 a b 1 a b 0 a b 1JG/JNLE
5、JGE/JNLJL/JNGEJLE/JNG带件符转号移数指条令ANDORANDOR 0 0 1 0 0 1 1 1JA/JNBEJAE/JNBJB/JNAEJBE/JNA无件符转号移数指条令条件转移指令及其判断条件分支程序设计举例1、两分支程序设计方法两分支程序设计方法2、多分支程序设计方法、多分支程序设计方法n(1)条件转移法n(2)地址表法n(3)跳转表二、分支程序设计程序如下:程序如下: TEST DA1, 01H JENEXT INC DA1NEXT: 测试DA1的第0位(DA1)0=0?DA1=(DA1)+1 Y N(b)试编制一程序段,把试编制一程序段,把DA1DA1字节单元中数据
6、变为偶数。字节单元中数据变为偶数。两分支程序设计方法两分支程序设计方法试编制一程序,实现两个存储区之间的数据传送。:0000H0FFFFH源存储区目的存储区:0000H0FFFFH源存储区目的存储区:0000H源存储区目的存储区0FFFFH(a)(b)(c)两存储区之间的三种情况两分支程序设计方法两分支程序设计方法开始 SI=源存储区首址 DI=目的存储区首址 CX(DI)?(CX)=0?形成末址:SI=(SI)+(CX)-1DI=(DI)+(CX)-1结束SI=(SI)-1DI=(DI)-1 FLAG2 两存储区之间数据传送流程(DI)=(SI)CX=(CX)-1CX=(CX)-1DI=(S
7、I)SI=(SI)+1DI=(DI)+1(CX)=0? N N Y Y FLAG3 源程序如下:源程序如下:DATA SEGMENT ORG 20HSTRING1 DB 5 DUP( ASSEMBLE 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 A
8、SSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV SI, ADDR1 ;将源空间的首地址存入将源空间的首地址存入SI寄存器中寄存器中 MOV DI, ADDR2 ;将目的空间的首地址存入将目的空间的首地址存入DI寄存器中寄存器中 MOV CX, COUNT ;将传送的字节数存入将传送的字节数存入CX寄存器中寄存器中 CMP SI, DI ;将源空间与目的空间的首地址将源空间与目的空间的首地址 JA FLAG2 ;如果源空间首地址大,从首地址开始传数,跳转相应程序如果源空间首地址大,从首地址开始传数,跳转相应程序 ADD SI, C
9、X ;如果目的空间首地址大,需从末地址开始,形成末地址如果目的空间首地址大,需从末地址开始,形成末地址 ADD DI, CXFLAG1: 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 INT 21H CODE ENDS END START
10、1、条件转移法、条件转移法多分支程序设计方法多分支程序设计方法 条件1分支程序1Y 条件2分支程序2 条件n分支程序nNNYYN多分支程序设计方法多分支程序设计方法2、地址表法、地址表法4FLAG1低8位FLAG1高8位FLAG2低8位FLAG2高8位NUM程序1入口地址FLAG5低8位FLAG5高8位程序2入口地址程序5入口地址ADDRTABADDRTAB+2ADDRTAB+8入口地址=地址表首地址+(参数-1)2 实现程序如下:实现程序如下: DATA SEGMENT NUM DB 4 ADDRTAB DW FLAG1, FLAG2, FLAG3, FLAG4, FLAG5 STRING1
11、 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 ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS: CODE, DS:DATA
12、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: MOV DX, OFFSET STRING2 JMP SHOW FLAG3: MOV DX, OFFSET STRING3 JMP SHOW FLAG4: MOV DX, OFFSET STRING4 JM
13、P SHOW FLAG5: MOV DX, OFFSET STRING5 JMP SHOW SHOW: MOV AH, 09H INT 21H MOV AH, 4CH INT 21H CODE ENDS END START多分支程序设计方法多分支程序设计方法3、跳转表法、跳转表法JUMP_TABJMP FLAG1JMP FLAG2JMP FLAG5实现程序如下:实现程序如下: DATA SEGMENT NUM DB 2 STRING1 DB HELLO WORLD!, 0AH, 0DH, $ STRING2 DB I LOVE THIS GAME, 0AH, 0DH, $ STRING3 DB
14、 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 SHL AL,1 ADD
15、 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
16、 AH, 09H INT 21H MOV AH, 4CH INT 21H CODE ENDS END STARTN循环结束工作部分修改部分结束处理部分初始化部分初始化部分Y控制部分初始化部分工作部分修改部分循环结束结束处理部分Y控制部分N第10章 循环程序设计一、循环程序基本结构 循环程序结构1、初始化部分n设置地址指针、计数器初值2、工作部分3、修改部分4、控制部分n用计数控制循环n用条件控制循环5、结束处理部分第10章 循环程序设计二、循环控制方法1、用计数控制循环n使用计数器,达到计数器预定值,循环结束。要求循环次数已知。n计数器可以递增、递减n可以选用寄存器、也可用存储单元第10章 循
17、环程序设计用正计数法,计算数组ARRAY所有单元的和 累加和、计数器、数组指针清0开始结束累加计数器=循环次数数?YN数组指针、计数器加1 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 ASSUME CS: CODE, DS:DATA START: MOV AX, DATA MOV DS, AX XOR AX,AX ;AX寄存器清0,累加用 MOV CX
18、,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 START2、用条件控制循环n找出一个终止循环的条件,每循环一次,对条件进行一次检测。满足终止循环的条件,退出循环,否则继续。n通常选用条件转移指令来控制循环是否结束。二、循环控制方法第10章 循环程序设计 编
19、写程序,求解兔子繁殖问题,给出到指定只兔子数时,需要多少个月。 开始结束新数给定数?YN月数CX初始化数列初始化交换AX, BX产生新的斐波那契数月数加1存储月数时间时间初生初生兔子兔子成熟成熟兔子兔子兔子兔子总数总数1 1 1 1 0 0 1 1 2 2 0 0 1 1 1 1 3 3 1 1 1 1 2 2 4 4 1 1 2 2 3 3 5 5 2 2 3 3 5 5 6 6 3 3 5 5 8 8 7 7 5 5 8 8 13 13 8 8 8 8 13 13 21 21 9 9 13 13 21 21 34 34 10 10 21 21 34 34 55 55 实现程序如下:实现程序
20、如下: 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,DATA MOV DS, AX XOR CX,CX ;计数器清计数器清0 MOV AX,0 ;斐波那契数初始值斐波那契数初始值 MOV BX,1 NEXT: XCHG AX,BX ADD AX,BX ;产生一个新的斐波那契数 IN
21、C CL ;计数器加1 CMP AX,RABBITNUM ;比较产生的新数与给定数 JAE RESULT ;如果大于或等于,结束 JMP NEXT ;小于,继续循环 RESULT: MOV MONTHNUM,CL MOV AH,4CH INT 21H CODE ENDS END START 1、内循环必须完整地包含在外循环内,二者不可以相互交叉。2、当从外循环再次进入内循环时,内循环的初始条件要重新设置。3、一个外循环中可以包含多个内循环,这些内循环可以嵌套,也可以并列存在。4、当内外循环都采用CX寄存器作为计数器时,由外循环进入内循环时,要保留外循环的次数,可以通过压入堆栈、存入其它寄存器或
22、存储器中实现。5、当外层循环要求内层循环在不同条件下重复执行时,外循环中应该包括对内循环部分参数的修改部分。三、多重循环程序设计第10章 循环程序设计开始结束 CX=0?YN行号J=0,乘法表指针DI=0外循环次数CX=9外循环次数CX入栈行号J加1I*J存入乘法表修改指针DI加1列号I=0,内循环次数CX=9列号I加1内循环次数CX减1恢复外循环次数外循环次数CX减1 CX=0?YN DATA SEGMENT MULTABLE DB 9*9 DUP(0) DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP (?) STACK1 ENDS CODE S
23、EGMENT 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 ;内循环次数为9INNERLOP:INC BL ;列号加1 MOV AL,BH ;将行号存入AL MUL BL ;将行号*列号存入AL MOV MULTABLEDI,AL ;将AL存入乘法表中 INC DI ;修改乘
24、法表指针 LOOP INNERLOP ;内循环控制语句 POP CX ;恢复外循环次数 LOOP OUTERLOP ;外循环控制语句 MOV AH,4CH INT 21H CODE ENDS END START第11章 子程序设计子程序的适应范围:(1)多次重复使用的程序段。如程序中多次出现的数值转换、码值转换等(2)具有特殊功能的程序段。如求解某一问题时,涉及到的复杂的数学计算,以及排序或查找等一些需要用到的算法问题。(3)具有通用性的程序段。如一些对文件的操作,字符串的操作等(4)中断服务程序。(5)系统调用程序。如DOS调用,BIOS调用等。重点n过程定义n过程调用n过程返回程序结构n过
25、程n主调过程(主程序)n被调过程(子程序)第11章 子程序设计过程定义过程名PROC 类型语句语句过程名ENDPNEARFAR第11章 子程序设计过程调用CALL 过程名返回地址入栈转移到(过程名所代表的)入口地址段内段间直接调用间接调用CALL INPUTCALL BXCALL WORD PTR BXCALL FAR PTR INPUTCALL OUTPUTCALL DWORD PTR BX第11章 子程序设计过程返回RET过程返回地址从栈中弹出到 IP (CS)中返回原来的调用点段内段间返回指令段内段间带立即数返回指令RETRET n第11章 子程序设计子程序设计方法1、适度地划分并确定子
26、程序功能n具有独立功能的程序作为一个模块n多次出现的程序段独立出来2、选择适当的参量传递途径3、信息的保存4、编写子程序的文字说明(1)在调用程序中保存信息 :PUSHPUSHPUSHCALLPOPPOPPOP :AXBXCXSUB_PROCCXBXAX;保存信息;调用子程序;恢复信息信息的保存(2)在子程序中保存信息SUB_PTOC1SUB_PROC1PROCPUSH BXPUSH CXPUSH SIPUSH BP : :POP BPPOP SIPOP CXPOP BXRETENDP子程序功能的指令序列信息的保存编写子程序的文字说明(1)子程序名。(2)子程序的功能描述。(3)子程序的入口参
27、数和出口参数。(4)子程序中使用了哪些寄存器、存储单元。(5)子程序中是否调用其他子程序。第11章 子程序设计参数传递n 用寄存器传递适合参数较少情况n 用参数表传递适合参数较多情况n 用堆栈传递适合参数多情况第11章 子程序设计UPTOLW PROC PUSHF CMP AL, A JB UP1 CMP AL, Z JA UP1 ADD AL, a-AUP1: POPF RETUPTOLW ENDP把大写字母改为小写字母;子程序名:UPTOLW;功能:大写转换小写;入口参数:AL=待转字符;出口参数:AL中放转换完字符MOV AL, RCALL UPTOLWMOV DL, AL过程调用寄存器
28、传递用减奇数法求平方根子程序流程开始结束 够减?Y寄存器入栈保护平方根加1减奇数形成下一个奇数N平方根初始化奇数初始化恢复寄存器实现程序为: 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 MOV SI
29、,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 ;如果不够减,结束
30、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 ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASSUME CS:C
31、ODE,DS:DATASTART: 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 ;
32、将子程序中用到的寄存器入栈保护 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 STARTARY DW -86, 420, 7, ,40COUNT DW 100SUM DW ?TAB DW 3 DUP(?)MOV TAB, OFFSE
33、T ARYMOV TAB+2, OFFSET COUNTMOV TAB+4, OFFSET 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)/
34、2 RESULT DW ? ADDRESS DW 3 DUP(0) ;定义地址表DATA ENDSSTACK1 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;将R
35、ESULT的地址存入地址表MOV BX,OFFSET ADDRESS ;将地址表的地址装入BXCALL SUM_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 ;A
36、X寄存器初始化 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过程调用用栈传递参数n在主调程序中压入参数n参数和返回地址在栈中的位置n在被调过程中读取参数n在主调程序中读取返回的参数用栈传递参数处理要点压入参数CALL从栈中弹出压入的参数用BP间址方式取出参数处理RET主调程序被调过程p参数压入顺序与取出顺序相反p参数的个数和类型按事先约定存取p调用结束时,从栈中清除压入的参数
37、利用堆栈传递参数,实现数组ARRAY单元的累加。 SPARRAY首地址COUNT内容RESULT地址SP返回地址ARRAY首地址COUNT内容RESULT地址SPBP返回地址AXSIDIARRAY首地址COUNT内容RESULT地址BPSP返回地址ARRAY首地址COUNT内容RESULT地址SP DATA SEGMENT ARRAY DW 21,22,23,24,25,26,27 COUNT DW ($-ARRAY)/2 RESULT DW ?DATA ENDSSTACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDSCODE SEGMENT ASS
38、UME 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 INT 21H SUM_PROC PROC PUSH AX ;将子程序中用到的寄存器入栈保护将子程序中用到的寄存器入栈保护 PUSH SI PUSH DI PUSH BP MOV BP,SP
39、 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 6 ENDP ENDS END START系统功能
40、调用由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。应用程序外设硬件接口BIOSDOS第12章 系统功能调用系统功能调用采用软中断指令 INT n (其中:n为中断类型码) (1)PUSHF,TF、IF清0,CS、IP入栈 (2)按中断类型码n,从中断向量表对应位置取出将要调用的功能子程序的入口地址CS,IP (3)功能子程序返回:IRETDOS功能调用调用方法:p 入口参数p 子程序编号送AHp INT 21HDOS功能调用基本I/O功能调用 功能 入口参数 出口参数 说明 键盘输入 AH =
41、 1AL=字符ASCII码字符显示控制台输入 AH = 8同1号无显示显示输出 AH = 2 DL = 字符ASCII码打印输出 AH = 5 DL = 字符ASCII码直接控制台 AH = 6,7 ZF=0,AL=字符ASCII码输入/输出 DL = 0FFH/字符码 ZF=1无键按下字符串输出 AH = 9字符串须以$结束 DS:DX=串首址字符串输入 AH = 0AH首先定义缓冲区 DS:DX=串首址(1) 从键盘输入一个字符(功能号功能号=1=1) MOV AH,MOV AH,1 1 ;等待按键 INT 21H INT 21H ;字符回显 AL (2) 从键盘输入一个字符,无显示(功能
42、号功能号=8=8) MOV AH,MOV AH,8 8 INT 21H INT 21H AL 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 IN
43、T 21HDOS功能调用(4)MOV DL,0FFH;键盘输入 MOV AH,6 INT 21H MOV DL,24H;屏幕输出 MOV AH,6 INT 21HDOS功能调用(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
44、) 此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。LEA DX, MOV AH, 0AHINT 21H DOS功能调用(预留的预留的N1个字节的存储单元个字节的存储单元) 0DHN2N1 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功能调用 功
45、能 入口参数 出口参数 说明 设置日期 AH = 2BHAL=0或AL=0FFH均为二进制数 CX=年号 DH=月,DL=日读取日期 AH = 2AHCX=年号均为二进制数DH=月,DL=日设置时间 AH = 2DH CH=小时,CL=分AL=0或AL=0FFH均为二进制数 DH=秒,DL=毫秒读取时间 AH = 2CHCH=小时,CL=分均为二进制数DH=秒,DL=毫秒MOV CX,1999MOV DH,5MOV DL,20MOV AH,2BH ;设置日期INT 21H;1999.5.20MOV AH,2AH ;取得日期INT 21H;cx:dx=1999.5.20MOV YEAR,CXMO
46、V MONTH,DHMOV DAY,DLDOS功能调用(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, DLDOS功能调用(8)设置/读出时间BIOS功能调用功能调用 BIOS调用通过多个软中断提供,调用方法为:MOV AH,INT BIOS中的几个主要中断类型如下:INT 10H屏幕显示INT 13H磁盘操作INT 14H串行口操作INT 16H键盘操作INT 17H打印机操作
47、每类中断由包含许多子功能,调用时通过功能号指定。BIOS功能调用键盘输入16H号功能调用功能 出口参数 说明 AH=0 AL=字符的ASCII码从键盘读一个字符 AH=1 ZF=1表示无键可读判键盘是否有键可读 ZF=0表示有键可读AH=2 AL=功能键状态字节取特殊功能键当前状态BIOS功能调用打印输出17H号功能调用 功能 入口参数 出口参数 说明 AH=0 AL=字符代码打印一个字符 DX=打印机号AH=1 DX=打印机号初始化打印机AH=2 DX=打印机号AL=状态字节取打印机状态BIOS功能调用显示输出10H号功能调用 功能 入口参数 出口参数 说明 AH=0 AL=方式号设置显示方
48、式AH=1 CH=光标开始行号置光标类型 CL=光标结束行号AH=2 DH=行号,DL=列号置光标位置 BH=页号AH=3 BH=页号 DH=行号,DL=列号读光标位置 CX=当前光标大小AH=5 AL=页号选择当前显示页BIOS功能调用显示输出10H号功能调用 功能 入口参数 出口参数 说明向上滚屏 AH=6,AL=上滚行数,BH=空行属性 CH、CL=滚动左上角行列号 DH、DL=滚动右下角行列号向下滚屏 AH=7 其余同6读光标处 AH=8AL=字符字符和属性 BH=页号AH=属性将字符和属性 AH=9,AL=字符写到光标处 BH=页号, CX=个数 BL=字符属性/颜色将字符写到 AH=0AH属性不变光标位置 其余同9第13章 汇编语言程序的开发与调试汇编语言程序的开发与调试结束N编辑程序语法错误Y.ASM文件NY宏编辑程序目标程序源程序执行程序连接程序有错误?调试程序.OBJ文件.EXE文件