第11讲 程序设计方法二_第1页
第11讲 程序设计方法二_第2页
第11讲 程序设计方法二_第3页
第11讲 程序设计方法二_第4页
第11讲 程序设计方法二_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

工程:排序工程要求与目的〔1〕工程要求:编写程序实现:在数据段中,有一个无序排列的无符号数组,这无符号数组存放的就是某次考试的学生成绩,其首地址存放在SI存放器中,数组中的第一个单元存放着数组长度,即考试考生人数。要求对这个无符号数组按降序排序,当然数组的第一个单元存放的仍然为数组长度。〔2〕工程目的:学习汇编的子程序结构和模块化程序设计方法。1§4-4程序设计方法——子程序结构1.子程序使用:子程序:将屡次使用的程序段写成一个相对独立的程序段,称为子程序或过程。子程序结构的定义:使用过程定义语句PROC…ENDP。属性:调用程序和过程在同一代码段中,那么用NEAR属性;调用程序和过程不在同一代码段中,使用FAR属性。主过程定义为FAR属性,看作DOS调用的一个子过程。子程序说明:⑴功能描述:名称,功能及性能⑵存放器,存储单元⑶入口参数,出口参数⑷调用其它子程序的名称四、子程序结构2§4-4程序设计方法——子程序结构例12有一个子程序说明如下:;名称:BCD2BIN;功能:将一个字节的BCD码转换成二进制数;所用存放器:CX;入口参数:AL存放两位BCD码;出口参数:AL存放二进制数;调其它子程序:无子程序形式如下;3§4-4程序设计方法——子程序结构BCD2BIN PROC NEAR(或FAR)

PUSHCX

MOV CH,AL AND CH,0FH ;存低4位 MOV CL,4 SHR AL,CL ;高4位右移4位后乘10 MOV CL,10 MUL CL ADD AL,CH ;高4位加低4位

POP CX RETBCD2BIN ENDP4§4-4程序设计方法——子程序结构注意:⑴保护调用程序的断点:由CALL指令本身完成。要注意堆栈的使用,防止弹出地址值错误。⑵保护某些存放器内容:在子程序开头,用一组PUSH指令,保护的存放器原来的内容;在子程序结尾,用一组POP指令,将存放器原来的内容恢复。注意:PUSH和POF指令组的使用次序。⑶主程序与子程序相互之间参数的传递:参数传递的方法有3种:①用存放器传递参数:参数较少,速度较快。②用存储器传递参数:参数较多,需事先在存储器中建立一个参数表。③用堆栈传递参数:参数较多,多用在子程序嵌套与递归调用中。5§4-4程序设计方法——子程序结构

例13数据段定义两个数组,编程序实现数组段分别求和(不计溢出)。解:本例通过存储器来传递参数。相应程序如下:DATA SEGMENT ARY1 DW100DUP(?) ;定义数组1 SUM1 DW? ARY2 DW100DUP(?) ;定义数组2 SUM2 DW?DATA ENDSSTACK SEGMENTSTACK SA DW50DUP(?)

TOP EQULENGTHSASTACKENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK6§4-4程序设计方法——子程序结构MAIN PROCFARSTART: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,TOP

LEA SI,ARY1 ;数组1首地址,入口参数 MOV CX,LENGTHARY1;数组1长度,入口参数 CALL SUM ;调用求和子程序 LEA SI,ARY2 ;数组2首地址,入口参数 MOV CX,LENGTHARY2;数组2长度,入口参数 CALL SUM ;调用求和子程序 RETMAIN ENDP7§4-4程序设计方法——子程序结构SUM PROC NEAR ;子程序 XOR AX,AX ;AX清0L1: ADD AX,WORDPTR[SI] ;加数组元素 INC SI INC SI LOOP L1 MOV WORDPTR[SI],AX ;数组和送入SUM MOV AH,4CH INT 21H RETSUM ENDP ;子程序返回CODE EDNS END START8§4-4程序设计方法——子程序结构

例14通过堆栈传递参数,实现十进制数数组求和,要求主程序和过程不在同一个代码段中,要进行段间调用。相应程序如下:MDATA SEGMENT ARY1 DB20DUP(?) ;定义数组1 SUM1 DW? ARY2 DB20DUP(?) ;定义数组2 SUM2 DW?MDATA ENDSMSTACK SEGMENTSTACK SB DW100DUP(?)

TOP LABELWORDMSTACK ENDSMCODE SEGMENT ;主程序段 ASSUMECS:MCODE,DS:MDATA,SS:MSTACKMAIN PROC FARSTART: MOV AX,MSTACK MOV SS,AX MOV SP,OFFSETTOP9§4-4程序设计方法——子程序结构 PUSH DS ;初始化DS,SS,SP MOV AX,0 PUSH AX MOV AX,MDATA MOV DS,AX

MOV AX,OFFSETARY1 ;PADD过程入口参数进栈 PUSH AX ;数组地址 MOV AX,SIZEARY1 ;数组长度 PUSH AX CALL FARPTRPADD

MOV AX,OFFSETARY2 PUSH AX MOV AX,SIZEARY2 PUSH AX CALL FARPTRPADD RETMAIN ENDPMCODEENDS10§4-4程序设计方法——子程序结构PCODE SEGMENT;过程段 ASSUMECS:PCODE,DS:MDATA,SS:MSTACKPADD PROC FAR PUSH BX;存放器保护 PUSH CX PUSH BP MOV BP,SP PUSHF ;标志入栈 MOV CX,[BP+10] ;数组长度→CX MOV BX,[BP+12];数组ARY起始地址→BX MOV AX,0NEXT: ADD AL,[BX] ;数组相加 DAA MOV DL,AL ;‘低位和’入DL暂存 MOV AL,0 11§4-4程序设计方法——子程序结构 ADC AL,AH ;AH+进位→AL DAA MOV AH,AL ;进位→AH MOV AL,DL ;从DL中取回低位和 INC BX LOOP NEXT MOV [BX],AX ;送数组和→SUM POPF ;标志出栈 POP BP POP CX POP BX RET 4 ;返回作废参数

;弹出返回地址后,再弹出4个字节数据PADD ENDP PCODE ENDS ENDSTART12§4-4程序设计方法——子程序结构该例用堆栈传递参数,堆栈中数据变化如以下图所示。总结:⑴调用前通过堆栈传递两个参数:数组的偏移地址值,数组长度。⑵进入过程时重新定义CS段:指向当前代码段PCODE。因为程序设计要求段间过程调用。⑶过程返回时:用返回指令RET4,将通过堆栈传递的4个参数作废。13§4-4程序设计方法——子程序结构14§4-4程序设计方法——子程序结构堆栈的变化:①初始化后,SP指向堆栈底,堆栈为空;②主程序调用过程前,二个参数(数组偏移地址及数组长度)已入栈;③执行CALL指令时,返回地址自动入栈;④过程中:BX,CX,BP,标志存放器入栈;继续执行过程段PCODE程序,利用BP,在堆栈中位置[BP+12]处获取数组偏移地址,在堆栈中位置[BP+10]处获取数组长度。⑤过程运行到RET4之前,由POP指令将PSW,BP,CX及BX相继弹出。⑥堆栈中还有4个字节的参数SIZE1和ARY1会影响下次过程调用参数的正确传递,用RET4将此4个字节的参数弹出作废。15§4-4程序设计方法——子程序结构2.子程序嵌套与递归调用:子程序嵌套:子程序本身又调用其它子程序。只要堆栈空间足够嵌套的层数不限。图5-12给出了子程序嵌套示意图。递归调用:子程序调用子程序本身。16§4-4程序设计方法——子程序结构例15己知两个无符号数125及468,求它们的和并将和转换成十六进制数在屏幕上显示。DATA SEGMENT P DW125,368 SUM DW?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATAMAIN PROC FARSTART PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX

MOV SI,OFFSETP

;数组起始地址→SI

CALL PADD

;两数相加子程序 RETMAIN ENDP17§4-4程序设计方法——子程序结构PADD PROC NEAR ;两数相加子程序

PUSH AX PUSH BX PUSH CX PUSH DX

MOV AX,[SI]

;数组起始地址→SI

ADD AX,[SI+2] MOV SUM,AX CALL DISP ;显示子程序

POP DX POP CX POP BX POP AX RETPADD ENDP18§4-4程序设计方法——子程序结构DISP PROC NEAR ;显示子程序

MOV BX,SUM

MOV CH,4

;16进制数的位数L1: MOV CL,4

ROL BX,CL ;循环左移4次:高4位→低4位

MOV AL,BL

AND AL,0FH

ADD AL,30H

;化成ASCII码

CMP AL,3AH JL L2 ADD AL,07HL2: MOVDL,AL ;显示 MOV AH,2 INT 21H DEC CH JNZ L1 RETDISP ENDPCODE ENDS END START19§4-4程序设计方法——子程序结构例16要求计算N!(N>=0)解:递归调用的应用:N!=N*(N一1)*(N一2)…*1N!=1, N=0N!=N*(N一1)!, N>0计算核心:N!子程序。注意入栈信息。N!子程序说明:;名称:FACT;功能:阶乘子程序;入口参数:AL=N;出口参效:DX=N!;使用存放器:CX20§4-4程序设计方法——子程序结构具体程序如下:ADATA SEGMENT D1 DB4 ;N=4 D2 DW2DUP(?) ;存放运算结果ADATA ENDSASTACK SEGMENTPARASTACK‘STACK’ SA DW100DUP(?)

TOP LABELWORDASTACK ENDSACODE SEGMENT ASSUMECS:ACODE,DS:ADATA,SS:ASTACK21§4-4程序设计方法——子程序结构MAIN PROC FARSTART: MOV AX,ASTACK MOV SS,AX MOV SP,OFFSETTOP PUSH DS MOV AX,0 PUSH AX MOV AX,ADATA ;初始化DS,SS,SP MOV DS,AX

MOV DX,0 ;DX=N! MOV AH,0 ;AH清零,为AL入栈保护 MOV BX,OFFSETD1 ;数据指针 MOV AL,[BX] ;AL=N,子程序的入口参数

CALL FACTLP1: MOV [BX+1],DX RETMAIN ENDP22§4-4程序设计方法——子程序结构FACT PROC ;N!子程序 CMP AL,0 JNZ CHN MOV DL,1 ;N=0,N!=1

RETCHN: PUSH AX ;N入栈 DEC AL ;N-1

CALL FACT ;递归调用FACT子程序LP2: POP AX ;N弹出 MUL DL ;N逐层返回相乘 MOV DX,AX ;送结果到内存

RETFACT ENDPACODE ENDS END START

23§4-4程序设计方法——综合举例1.代码转换:例17将十六位二进制数转换成4位压缩型BCD码算法:将AX中的二进制数先后除以l000、100和10,每次除法所得的商,即是BCD数的千位、百位和十位数,余数是个位数。(例如,810D=032AH,9999D=270FH,)子程序名:B2TOBCD输入参数:AX=十六位二进制数输出参数:CF=0,那么AX=4位压缩型BCD码;CF=1,那么要转换的数大于9999,AX不变。使用存放器:CX:存放除数;DX:存放中间结果。五、综合举例24§4-4程序设计方法——综合举例B2TOBCD PROC FAR CMP AX,9999 ;AX>9999,那么CF置1 JBE TRAN STC JMP EXITTRAN: PUSH CX PUSH DX SUB DX,DX ;DX清0 MOV CX,1000 ;计算千位数 DIV CX ;商在AX,余数在DX XCHG AX,DX ;商在DX中,余数在AX中;DX=___× MOV CL,4 SHL DX,CL ;DX左移4位,DX=__×_ MOV CL,100 ;计算百位数 DIV CL25§4-4程序设计方法——综合举例 ADD DL,AL ;百位数加到DL中,DX=__×× MOV CL,4 SHL DX,CL ;DX左移4位,DX=_××_ XCHG AL,AH ;余数保存在AL中 SUB AH,AH MOV CL,10 ;计算十位数 DIV CL ADD DL,AL ;十位数加到DL中,DX=_××× MOV CL,4 SHL DX,CL ;DX左移4位,DX=×××_ ADD DL,AH ;加个位数,DX=×××× MOV AX,DX ;结果送到AX中 POP DX POP CXEXIT: RETB2TOBCD ENDP26§4-4程序设计方法——综合举例例18将十进制数的ASCII字符串转换成有符号二进制数算法:首先检测字符串为正还是为负,假设是为负,将标识符MINU置1,然后进行字符串转换,转换结束判别标识符MINU,假设MINU是1,把AX中的数取补。字符串转换方法:采用累加和(DX)乘10,然后读取下一个字符并转换成二进制数加到累加和中。〔例:41965=(((4×10+1)×10+9)×10+6)×10+5〕子程序名:AS2BIN输入参数:DX=字符串偏移量;CX=字符串字符个数输出参数:CF=0,那么AX=二进制数;CF=1,那么字符串非法,AX=0。使用存放器:SI,BX27§4-4程序设计方法——综合举例AS2BIN PROC FAR PUSH CX PUSH DX PUSH SI MOV SI,DX ;字符串指针DX存到SI中 CMP CX,6 ;最长6位 JA ERR CLD MOV AL,[SI] ;查符号 CMP AL,‘-’ JNE CHK MOV MINU,1 ;带负号,例:‘-41965’ JMP DECSCHK: CMP AL,‘+’ ;带正号,例:‘+41965’ JNE CLRDDECS: DEC CX ;长度减1 INC SI ;指针下移CLRD: SUB DX,DX ;DX清0,放结果28§4-4程序设计方法——综合举例NEXT:

CALL CHE ;乘10 JC ERR ;积超过65535出错 LODSB ;读下一个字符到AL CMP AL,‘0’ ;字符不在0~9之间,出错 JB ERR CMP AL,‘9’ JA ERR AND AX,000FH ;转换成二进制数 ADD DX,AX JC ERR ;累加和超过65535出错

LOOP NEXT MOV AX,DX ;结果送入AX CMP MINU,1 ;负数求补 JNE EXIT NEG AX ;求补 JMP EXITERR: STC ;字符串为非法29§4-4程序设计方法——综合举例

MOV AX,0EXIT: POP SI POP DX POP CX

RETCHE PROC NEAR;乘10子程序,第1次调用,

温馨提示

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

评论

0/150

提交评论