您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第5章 汇编语言程序设计
第5章汇编语言程序设计教学内容5.1汇编语言程序的上机过程。5.2顺序结构程序设计。5.3分支结构程序设计。5.4循环结构程序设计。5.5子程序结构设计。教学目标1理解汇编语言程序的建立与运行的方法。2掌握顺序结构程序设计方法。3掌握分支结构程序设计方法。4掌握循环结构程序设计方法。5掌握子程序结构程序设计方法。重点内容1汇编语言程序的上机过程。2顺序结构程序设计。3分支程序设计。4循环程序设计。5子程序结构程序设计。难点内容1分支程序设计。2循环程序设计。3子程序结构程序设计。学时数8学时汇编语言程序的步骤:(1)明确任务,确定算法。(2)绘流程图。(3)根据流程图编写汇编语言程序。(4)上机调试程序。5.1汇编语言程序的上机过程1、源文件的建立和汇编(1)建立源程序文件(2)汇编源程序文件汇编程序主要功能:·检查源程序中的语法错误并给出出错信息。·产生目标文件,列表文件和对照文件。·展开宏指令。汇编操作过程:设在当前C盘上已经建立了一个扩展名为ASM的源程序文件MYASM,汇编时发出如下命令:C:>MASMMYASM↙(或MASMMYASM.ASM↙)具体的三个输入提示行显示如下:ObjectFilename[MYASM.OBJ]:↙SourceListing[NUL.LST]:(可打入源文件名或省略)↙CrossReference[NUL.CRF]:(可打入源文件名或省略)↙汇编程序对源文件进行汇编,若无错误信息则显示如下结果:0WarningErrors0SevereErrors2.目标文件的链接连接软件LINK的功能:1)找到要连接的所有目标文件;2)确定所有段的地址值;3)确定所有浮动地址和外部符号所对应的存储地址;4)生成.EXE可执行文件。连接软件为LINK.EXE,其过程如下:设源文件MYASM.ASM已经由汇编软件汇编后生成MYASM.OBJ,其连接命令为:C:>LINKMYASM或LINKMYASM.OBJ则在屏幕上显示连接软件的版本号和三个输入提示行,三个输入提示行显示如下:RunFile[MYASM.EXE]:ListFile[NUL.MAP]:Libraries[.LIB]:3.执行文件的调试(略)5.2顺序结构程序设计例5.1用8086CPU的指令实现两个32位无符号数乘法的程序设计。1)明确任务,确定算法。2)绘流程图(图5.3)难点:8086指令系统中没有32位乘法指令,但可以用以下方法实现。ab×cd=(a×65536+b)×(c×65536+d)=a×c×65536×65536+a×d×65536+b×c×65536+b×d=a×c←16←16+a×d←16+b×c←16+b×d3)根据流程图编写汇编语言程序1NAME32BITMULTIPLY2DATASEGMENT3MULNUNDW0000,0FFFFH,0000,40FFFH,4DUP(?)5DATAENDS6STACKSEGMENTPARASTACK’STACK’7DB100DUP(?)8STACKENDS9CODESEGMENT10ASSRMECS:CODE,DS:DATA,11SS:STACK,ES:DATA12MAINPROCFAR13START:PUSHDS;为返回设置断点地址14MOVAX,015PUSHAX16MOVAX,DATA;取段基地址,DATA是段名,立即寻址17MOVDS,AX18MOVES,AX19LEABX,MULNUM;取偏移量20MULU32:MOVAX,[BX];取b21MOVSI,[BX+4];取d22MOVDI,[BX+6];取c23MULSI;b*d24MOV[BX+8],AX;存b*d25MOV[BX+0AH],DX26MOVAX,[BX+2];取a27MULSI;a*d28ADDAX,[BX+0AH];存(a*d←16)+b*d29ADCDX,030MOV[BX+0AH],AX31MOV[BX+0CH],DX32MOVAX,[BX];再取b33MULDI;b*c34ADDAX,[BX+0AH];存(b*c←16)+(9a*d←16+b*d)35ADCDX,[BX+0CH]36MOV[BX+0AH],AX37MOV[BX+0CH],DX38PUSHF;保存可能的进位位39MOVAX,[BX+2];取a40MULDI;a*c41POPF;恢复可能的进位位42ADCAX,[BX+0CH];存(a*c←16←16)+……43ADCDX,044MOV[BX+0CH],AX45MOV[BX+0EH],DX46RET47MAINENDP48CODEENDS49ENDSTART例5.2用查表的方法将一位十六进制数转换成与它相应的ASCⅡ码。1)明确任务,确定算法。2)绘流程图(图5-4)3)根据流程图编写汇编语言程序DATASEGMENTTABLEDB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46HHEXDB?ASCIDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)TOPLABELWORDSTACK1ENDSCOSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1BEING:MOVAX,DATA;取段基地址,DATA是段名,立即寻址MOVDS,AXMOVAX,STACK1MOVSS,AXMOVSP,OFFSETTOPMOVSI,OFFSETTABLEMOVAH,0MOVAL,HEXADDSI,AXMOVAL,[SI]MOVASCI,ALMOVAH,4CHINT21HCOSEGENDSENDBEING作业:在存储器中有4个16位的无符号数a、b、c、d,编程实现a*b+c-d,结果放入存储器中。提示:1以例5-1为基础,修改处理部分实现本题要求。2注意a*b获得的积是32位数,结果也是32位数。3做加法和减法时注意低16位到高16位的进位和借位的处理。5.3分支结构程序设计5.3.1二分支结构例5.4求补码数的绝对值。1)明确任务,确定算法。2)绘流程图(图5-7)3)根据流程图编写汇编语言程序STACKSEGMENTSTACKDW300DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTXADRDW?DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACKMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVAX,XADRANDAX,AXJNSDONENEGAXMOVXADR,AXDONE:RETMAINENDPCODEENDSENDSTART例5.3在长度小于256的字符串中分别统计数字、字母和其它字符的个数。1)明确任务,确定算法。2)绘流程图(图5-6)3)根据流程图编写汇编语言程序DATASEGMENTBUFDBNDB07H,2AH,47H,6AH,…96HNUMDB3DUP(?)DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVSI,OFFSETBUFMOVCH,[SI]MOVCL,CHMOVBX,0INCSILP:MOVAH,[SI]CMPAH,30HJLNEXTCMPAH,39HJGABCINCBHJMPNEXTABC:CMPAH,41H;大写字符JLNEXTCMPAH,5AHJGNEXTINCBLNEXT:INCSIDECCHJNZLPMOVSI,OFFSETNUMMOV[SI],BHMOV[SI+1],BLSUBCL,BHSUBCL,BLMOV[SI+2],CLRETMAINENDPCODEENDSENDSTART5.3.2多分支结构1.条件逐次测试法例5.5编程实现使键盘上A、B、…、F六个字母键成为6个输入命令,使之分别对应6个具有不同算法的控制子程序。1)明确任务,确定算法。2)绘流程图(图5-8)3)根据流程图编写汇编语言程序MOVAH,lINT21HCMPAL,‘A’JEPACMPAL,‘B’JEPB┇CMPAL,‘F’JEPFHLTPA:PB:┇PF:2.列表跳转法(1)根据表内地址跳转法例5.6利用表内地址跳转法来实现例5.5的要求1)明确任务,确定算法。2)绘流程图(图5-10)3)根据流程图编写汇编语言程序ADATASEGMENTBASEDWPA,PB,PC,PD,PE,PFKEYDB?ADATAENDSASTACKSEGMENTPARASTACK‘STACK’DW100DUP(?)TOPLABELWORDASTACKENDSACODESEGMENTASSUMECS:ACODE,DS:ADATA,SS:ASTACKMAINPROCFARSTART:PUSHDSMOVAX,0PUSHAXMOVAX,ADATAMOVDS,AXMOVAX,ASTACKMOVSS,AXMOVSP,OFFSETTOPLOP:MOVAH,1INT21HCMPAL,41HJBLOPCMPAL,46HJALOPSUBAL,41HMOVBX,OFFSETBASEMOVAH,0ADDAL,ALADDBX,AXJMPWORDPTR[BX]┋RETMAINENDPCODEENDSENDSTART(2)根据表内指令跳转法例5.7利用表内指令跳转法来实现例5.5的要求1)明确任务,确定算法。2)绘流程图(图5-12)3)根据流程图编写汇编语言程序DATASEGMENTBASEDBE9,PAL,PAH,E9,PBL,PBH,E9,PCL,PCHDBE9,PDL,PDH,E9,PEL,PEH,E9,PFL,PFHDATAENDS┋LOP:MOVAH,1INT21HCMPAL,41HJBLOPCMPAL,46HJALOPSUBAL,41HMOVAH,0MOVBL,ALADDAL,ALADDAL,BLMOVBX,OFFSETBASEADDBX,AXJMPBX┋(3)根据表内关键字跳转法例5.8利用表内关键字跳转法实现例5.5的要求1)明确任务,确定算法。2)绘流程图(图5-14)3)根据流程图编写汇编语言程序BDATASEGMENTBASEDB41HDWPADB42HDWPBDB43HDWPCDB44HDWPDDB45HDWPEDB46HDWPFBDATATENDS┋LOP:MOVAH,1INT21HCMPAL,41HJBLOPCMPAL,46HJALOPMOVSI,OFFSETBASENEXT:CMPAL,[SI]JEDOADDSI,3JMPNEXTDO:MOVBX,WORDPTR[SI+1]JMPWORDPTR[BX]┋作业:一个字节中存有2个十六进制数(高、低4位),用分支法将其分别转换成对应的ASC码。提示:1以例5-4为基础,修改处理部分实现本题要求。2注意高4位和低4位分别处理。30~9和A~F的ASC码分别处于2个连续空间。4在分支结构中注意上一个处理结束后要用转移指令跳过下一个处理。5.4循环结构程序设计5.4.1循环程序的组成与结构形式两种循环程序结构:WHILE_DO结构和DO_UNTIL结构例5.9试编写一程序统计出某一内存单元中‘1’的个数.并将结果存入RESULT单元中。1)明确任务,确定算法。2)绘流程图(图5-17)3)根据流程图编写汇编语言程序DATASEGMENTXDADW3AD8HRESULTDW?DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATA;取段基地址,DATA是段名,立即寻址MOVDS,AXMOVCX,0MOVAX,XDA;取XDA中的数,直接寻址AGAIN
本文标题:第5章 汇编语言程序设计
链接地址:https://www.777doc.com/doc-3202297 .html