您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 河北工业大学-汇编实验报告
..汇编实验实验一顺序与分支程序设计一、实验目的1)掌握顺序程序设计方法。2)掌握分支程序的结构及分支程序的设计,调试方法。2)学习数据传送及算术和逻辑运算指令的用法。3)熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。二、实验内容1)有一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。2)有两个两字节无符号数分别放在存储单元A、B起始的缓冲器中,求其和,结果放在A起始的缓冲区并在屏幕上显示。相加若有进位不存入存储单元。3)在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示。4)要求同上,只是比较的数为有符号数。5)将1000H单元开始的10个字节数,采用奇偶校验,将奇数在前偶数在后仍存回原数据区。本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。6)从键盘上接收一位十进制数X,计算Y值,并以十六进制形式显示出来,Y按下列公式计算。)6(2/)5()4(2)3(2222XXXXXXXXXXY..7)从键盘上接收两个一位十六进制数X和Y,然后再输入一个A-D之间的一个字符,按下列要求计算。a)当输入字符为A,则计算X+Y,并以十六进制形式显示出来b)当输入字符为B,则计算|X-Y|,并以十六进制形式显示出来c)当输入字符为C,则计算X*Y,并以十六进制形式显示出来d)当输入字符为D,则计算X/Y,并以十六进制形式显示出来三、实验设备PC机一台四、实验准备1)分析题目,将程序中的原始数据和最终结果的存取方法确定好。2)画出流程图。3)写出源程序。4)对程序中的结果进行分析,并准备好上机调试与用汇编程序及汇编调试的过程。五、实验步骤1)输入源程序。2)汇编、连接程序,生成.EXE文件,执行文件,检查结果。六、实验报告的要求1)列出源程序,说明程序的基本结构,包括程序中各部分的功能。2)说明程序中各部分所用的算法。3)说明主要符号和所用到寄存器的功能。4)总结为什么在设计分支程序时必须解决三个问题:判断、转向和定标号。5)说明标志位CF、SF和OF的意义。6)上机调试过程中遇到的问题是如何解决的。7)对调试源程序的结果进行分析。..Exam1:DATASEGMENT;数据段BUF1DW7898HBUF2DW4DUP(0),0AH,0DH,'$'BUF3DW4DUP(0),'$'DATAENDS;数据段结束CODESEGMENT;代码段ASSUMECS:CODE,DS:DATA;段寄存器关联说明伪指令BEGIN:MOVAX,DATAMOVDS,AX;将数据段的基地址装入数据段寄存器DSMOVAX,BUF1;将字型变量BUF1的值装入AX寄存器ADDAX,0;AX寄存器里的数据加0,以便进行转移测试JSNEXT;判断(AX)的正负,若为负则转到NEXT,为正则往下顺序执行。MOVBUF2,AX;为正,反码与原码一样MOVBUF3,AX;为正,补码与原码一样JMPEEENEXT:ANDAX,7FFFH;将符号位变为0NOTAX;求反码MOVBUF2,AX;将BUF1的反码装入BUF2INCAX;求补码MOVBUF3,AX;将补码装入BUF3EEE:MOVCX,0004H;将0004H装入CX计数器寄存器中MOVDI,OFFSETBUF2;将DI指向变量BUF2开始的存储单元MOVDX,[DI];将DI所指的数据装入DX寄存器中ADDDI,03;将DI指针下移三个字BBB:MOVAX,DX;将DX中的内容装入AX寄存器中ANDAX,000FH;即使BUF2的低四位不变,其余均变为0CMPAL,0AH;比较[AL]与0AH的大小,以便能正确转换为0-9的ASCII值JBQQQ;若[AL]0AH,则转到QQQ,否则,顺序执行..ADDAL,07H;因为[AL]0AH,所以[AL]+07H,使得AL能转换成相应数字的ASCII值QQQ:ADDAL,30H;将[AL]转换成相应数字的ASCII值MOV[DI],AL;将AL中的内容装入以DS中的内容为段基地址,以DI的内容为偏移地址的存储单元中DECDI;DI=DI-1,即将DI指向前一个存储单元PUSHCX;保存CX寄存器的内容MOVCL,04H;给CL寄存器赋值为04HSHRDX,CL;将[DX]逻辑右移四位POPCX;恢复CX寄存器的内容LOOPBBB;循环判断语句,CX=CX-1,若CX不等于0,则转到BBB,将下一个低四位存入存储单元中,否则循环结束MOVCX,0004H;给CX寄存器赋值为0004HMOVSI,OFFSETBUF3;将SI指向变量BUF3开始的存储单元MOVDX,[SI];将SI所指的数据装入DX寄存器中ADDSI,03H;将DI指针下移三个字CCC:MOVAX,DX;将DX中的内容装入AX寄存器中ANDAX,000FH;即使BUF3的低四位不变,其余均变为0CMPAL,0AH;比较[AL]与0AH的大小,以便能正确转换为0-9的ASCII值JBDDD;若[AL]0AH,则转到DDD,否则,顺序执行ADDAL,07H;因为[AL]0AH,所以[AL]+07H,使得AL能转换成相应数字的ASCII值DDD:ADDAL,30H;将[AL]转换成相应数字的ASCII值MOV[SI],AL;将AL中的内容装入以DS中的内容为段基地址,以SI的内容为偏移地址的存储单元中DECSI;SI=SI-1,即将SI指向前一个存储单元PUSHCX;保存CX寄存器的内容MOVCL,04H;给CL寄存器赋值为04HSHRDX,CL;将[DX]逻辑右移四位..POPCX;恢复CX寄存器的内容LOOPCCC;循环判断语句,CX=CX-1,若CX不等于0,则转到CCC,将下一个低四位存入存储单元中,否则循环结束MOVDX,OFFSETBUF2;将BUF2的偏移地址装入DX寄存器中MOVAH,09HINT21H;在屏幕上显示BUF1的反码MOVDX,OFFSETBUF3MOVAH,09HINT21H;在屏幕上显示BUF1的补码MOVAH,4CHINT21H;带返回码终止CODEENDSENDBEGINExam2:DATASEGMENT;数据段ADB34H,18H,2DUP(0),'$';定义字节型变量,其后的每操作数都占有一个字节..BDB56H,83H;定义字节型变量,其后的每操作数都占有一个字节DATAENDS;数据段结束CODESEGMENT;代码段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;将数据段基地址装入数据段寄存器DSMOVAL,A;将A所指的数装入AL寄存器中MOVBL,B;将B所指的数装入BL寄存器中ADDAL,BL;AL+BL-ALMOVAH,A+1;将A所指的下一个字节的数据装入AHMOVBH,B+1;将B所指的下一个字节的数据装入BHADCAH,BH;AH与BH进行带进位加法MOVA,AL;将第一个无符号数的相加结果放在以A起始的缓冲区MOVA+1,AH;将第二个无符号数的相加结果放在以A+1起始的缓冲区MOVCX,0014H;以下是将数据转换为相应的ASCII值MOVDI,OFFSETAMOVDX,[DI]ADDDI,03NEXT:MOVAX,DXANDAX,000FHCMPAL,0AHJBQQQADDAL,07HQQQ:ADDAL,30HMOV[DI],ALDECDIPUSHCXMOVCL,14SHRDX,CLPOPCXLOOPNEXTMOVDX,OFFSETA..MOVAH,09HINT21H;在屏幕上显示结果MOVAH,4CHINT21H;带返回码终止CODEENDSENDSTARTExam3:STACKSEGMENTSTACK;堆栈段DB1000DUP(0);定义其后的每个操作数都占有一个字节STACKENDS;堆栈段结束DATASEGMENT;数据段BUFDB72H,34H,1FH;定义字节型变量,其后的每操作数都占有一个字节MAXDB2DUP(?),'$';定义字节型变量,其后的每操作数都占有一个字节DATAENDS;数据段结束CODESEGMENT;代码段ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATA..MOVDS,AX;将数据段基地址装入数据段寄存器DSMOVAL,BUF;将BUF所指向的一个字节数据装入ALCMPAL,BUF+1;比较BUF与BUF+1大小JNBLP1;如果BUF不小于BUF+1,则转到lp1,否则顺序向下执行MOVAL,BUF+1;将BUF+1所指向的一个字节数据装入ALLP1:CMPAL,BUF+2;将BUF和BUF1中较大的一个和BUF+2比较大小JAELP2;如果BUF2小,则转到lp2,否则执行顺序向下执行MOVAL,BUF+2;此时BUF2为三个数中最大的一个,将最大数装入AL寄存器中LP2:MOVCX,04H;以下是将输出的最大数转换为相应的ASCII值MOVDI,OFFSETMAXMOVDL,ALINCDILP3:ANDAL,0FHCMPAL,0AHJBLP4ADDAL,07HLP4:ADDAL,30HMOV[DI],ALDECDIPUSHCXMOVCL,03HSHRDL,CLPOPCXMOVAL,DLLOOPLP3MOVDX,OFFSETMAXMOVAH,09HINT21HMOVAH,4CHINT21HCODEENDS..ENDBEGINExam4:STACKSEGMENTSTACKDB1000DUP(0)STACKENDSDATASEGMENTBUFDB98H,75H,32HMAXDB4DUP(?),'$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVAL,BUF..CMPAL,BUF+1JGLP1;JG为比较两个有带符号数的大小,比较BUF和BUF1的大小,若BUFBUF1,则跳转到lp1继续执行,否则顺序向下执行XCHGAL,BUF+1;交换AL寄存器中的内容和BUF1,使AL寄存器中存放BUF和BUF1中较大的一个LP1:MOVMAX,ALJGElp2;比较两个带符号数,如果BUF2小,则转到lp2,否则执行顺序向下执行MOVAL,BUF+2Lp2:MOVMAX,AL;以下是将输出的最大数转换为相应的ASCII值,与1)题相同MOVCX,04HMOVDI,OFFSETMAXMOVDL,[DI]INCDILP3:MOVAL,DLANDAL,0FHCMPAL,0AHJBLP4ADDAL,07HLP4:ADDAL,30HMOV[DI],ALDECDIPUSHCXMOVCL,02SHRDX,CLPOPCXLOOPLP3MOVDX,OFFSETMAXMOVAH,09HINT21HMOVAH,4CHINT21HCODEENDSENDBEGIN..实验二循环与子程序程序设计一、实验目的1)加深对循环结构的理解。2)掌握循环程序的设计方法。3)学习子程序的定义和调用方法。4)掌握子程序、子程序的嵌套、递归子程序的结构。5)掌握子程序设计、编制及调试。6)熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。二、实验内容1)编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。2)将从3000H内存单元开始的100个字节存储单元全部清0。3)编制在屏幕上显示九九乘法表的程序。4)编制在屏幕上显示用*组成的三角形的程序。..5)设有五个字数据存放在以BUF为首地址的内存单元中,要求采用调用多个字数据相加的子程序方法编程,和的低位字放在RESULT单元,和的高位字放在RESULT+2单元,并将结果显示在屏幕上。6)编写一个递归子程序,计算指数函数Xn的值,
本文标题:河北工业大学-汇编实验报告
链接地址:https://www.777doc.com/doc-5170994 .html