下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 西交大微机原理与接口技术实验报告

西交大微机原理与接口技术实验报告.doc

西交大微机原理与接口技术实验报告

merry爽
2019-02-25 0人阅读 举报 0 0 暂无简介

简介:本文档为《西交大微机原理与接口技术实验报告doc》,可适用于IT/计算机领域

微机原理与接口技术实验报告学院:班级:姓名:学号:西安交通大学实验报告课程 微机原理与接口技术 实验日期    年 月 日专业班号         交报告日期   年 月 日姓名           学号    共  页 第页实验数据传送、算术运算、循环程序结构一、实验目的.熟悉汇编语言源程序的框架结构并掌握汇编语言程序的编写、汇编、连接、执行的过程并利用TurboDebugger调试汇编程序。.熟悉指令系统的数据传送指令掌握寻址方式。.熟悉指令系统的算术运算指令。掌握循环结构汇编语言程序的编制。二、实验任务教材P第、题。教材P第、题。 、实验内容实验:教材P第题设有两个个字节长的BCD码数据BCD及BCD。BCD数以H为首地址在内存中顺序存放BCD数以H为首地址在内存中顺序存放。要求相加后结果顺序存放在以H为首地址的内存区中(设结果BCD数仍不超过个字节长)。【实验原理】考虑两个个字节长的BCD码相加首先根据地址要求将数据放在对应的地址单元中然后做加法BCD码相加要用到调整指令结果才为正确的BCD数。若为分离BCD码调整指令为AAA组合BCD码调整指令为DAA。【程序框图】【程序源代码】DATASSEGMENTORG  HBCDDBH,H,H,H,H,H,H,H起始地址为HORG  HBCDDBH,H,H,H,H,H,H,H起始地址为H DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVCX,         字节数送CXMOVBX,         地址指针BX清零CLC            进位标志CF清零L:MOVAL,BXH     取BCD的一个字节ADCAL,BXH     与BCD的一个相应字节及进位标志相加AAA            分离BCD码加修正MOVBXH,AL     和存入加上内存区INCBX          修改地址指针LOOPL          个字节未加完继续循环进行MOVAH,CHINTHCODESENDSENDSTART【程序运行结果】BCD码为:BCDDBH,H,H,H,H,H,H,HBCDDBH,H,H,H,H,H,H,H相加结果:    HHHHHHHH(分离BCD码)实验:教材P第题设从H为首地址的内存中存放着个带符号的字节数据试编写“找出其中最大的数并存入H单元中“的程序。【实验原理】首先把十个带符号数放在要求的的存储单元中然后再进行比较有符号数的比 较用JL,JC,JNG等指令首先设计一个最小带符号数H作为比较初值用H单元中的数分别与其它进行比较若大于则把该单元的数存入H单元否则不予处理(即“打擂台”)。对于该题采用的是字符串指令由于是隐含寻址把H中的数作为字符串源操作数其它进行一次循环则依次放入AL中注意的是当CX为时DL=H。【程序框图】【程序源代码】DATA SEGMENTORG  H   数据存放在H开始的单元BCD  DB H,H,H,H,AH,BH,H,H,H,HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,H 地址指针置初值MOV CX,  字节数送CXMOV DL,H  最小的有符号的字节数据即负数最小值L:  LODSB     从SI所指单元取一个字节送ALSI>SICMP AL,DL  比较带符号数(AL)>(DL)么?JNG L    (DL)大则跳转LMOV DL,AL  DL指向内容小则交换L:  LOOPL    字节未比较完则继续MOV DS:H,DL最大数存放在H单元MOV AH,CHINT H  CODEENDSEND START【程序运行结果】运行:BCD DB H,H,H,H,AH,BH,H,H,H,H结果:BCD DB H,H,H,H,AH,BH,H,H,H,H最大的数为H存放在DS:H单元中。实验:教材P第题试编制一程序用乘法指令实现位二进制数与位二进制数相乘。【实验原理】设A、B为被乘数的高、低位二进制数C为位二进制乘数通过分析可知共需进行两次乘法运算每次进行两个位二进制数的乘法共得到两个部分积然后再求部分积累加和。【程序框图】【程序源代码】DATA SEGMENTORGHNDWHA数NDWHB数NDWHC数ORGHMDW存放结果的高位MDW存放结果的中间位MDW存放结果的低位DATA  ENDSCODE  SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA  MOV DS,AX    MOV AX,NMUL N  BxCMOV M,AXMOV M,DXMOV AX,NMUL N  AxCADD M,AXADC M,DXMOV AH,CHINT HCODEENDSEND START【程序运行结果】执行:HxH=DABCDEDEH乘数和被乘数存放在:DS:H中相乘结果存放在:DS:H实验:教材P第题设有两个等字长字节型字符串试编写一汇编程序比较它们是否完全相等若相等则将字符Y送入AL中否则将字符N送入字符中。【实验原理】首先分别将要比较的字符串和字符串的首地址送入SI、DI中然后利用重复指令REPZ和字符比较指令CMPSB逐字符比较若发现不等则结束比较输出“N”若相等则比较下一字符直到字符串结束。【程序框图】【程序源代码】DATA SEGMENTSTRING DB 'weiji','$' 共比较的两个字符串STRING DB 'weiji','$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,STRING取字符串首地址LEA DI,STRING取字符串首地址MOV CX,REPZCMPSBSTRING,STRING比较字符串中的每个字符JNZ LABNEMOV AL,'Y'JMP EXITLABNE: MOV AL,'N'EXIT: MOV DL,AL 显示结果MOV AH,HINT HMOV AH,CHINT HCODEENDSEND START【程序运行结果】()当两个字符串为:‘weiji’和‘weiji’时(即两字符串不相同时)()当两个字符串为:‘weiji’和‘weiji’时(即两字符串相同时)、实验总结【实验中遇到的问题】首次进行上机操作对汇编语言程序的编写、汇编、连接、执行的过程开始很不熟悉用了大量时间去了解一些基本的操作运用汇编直接在程序中显示结果要调用子功能号查阅了相关书籍并完成了程序的编写。【实验收获与心得】实验一的内容总体来说比较简单我学会了利用TurboDebugger调试汇编程序。熟悉汇编语言源程序的框架结构并掌握汇编语言程序的编写、汇编、连接、执行的过程并利用TurboDebugger调试汇编程序。熟悉指令系统的数据传送指令掌握寻址方式。熟悉指令系统的算术运算指令。掌握循环结构汇编语言程序的编制。实验汇编语言程序设计一、实验目的.练习编写较复杂汇编语言程序时程序框图的绘制。.子程序定义与调用参数传递的方法。.了解宏指令的定义与调用并与子程序定义与调用进行比较。.掌握利用软件中断实现DOS系统调用的方法。、实验任务.教材章页第题设n=。提示:编写一个判断某数是否质数的子程序主程序调用该子程序对顺序递增的自然数进行是否质数的判断若是则存放在质数缓冲区中直到找到个质数  程序结束。判断一个数N是否是质数的一种算法是:将N顺序与~N的数相除 若每次除法的余数均不等于则该数是质数。注意:的除法支持双字除以字字除以字节本题中可以选择字除以字节。正确结果为:BDD(十六进制数).调试教材P~例的程序(设N=)跟踪IP变化观察堆栈的变化理解子程序递归调用中程序执行的流程以及帧信息的组成。(注意BP的变化)。.编写一个通用多字节数相加的宏定义并调用它实现多字节数的加法注意观察汇编时宏调用被展开的情况。(提示:用MASM命令汇编时加选项-L在生成OBJ文件时同时生成LST文件观察LST列表文件可以看到宏展开的情况).编写程序:屏幕显示“Password:”随后从键盘读入字符串并比较这个字符串与程序内部设定的字符串。若二者相同则显示“Hello!”否则显示“Sorry!”注意:要求键盘输入字符不能直接回显在显示器上而要用*号代替。、实验内容实验:教材章页第题设n=。提示:编写一个判断某数是否质数的子程序主程序调用该子程序对顺序递增的自然数进行是否质数的判断若是则存放在质数缓冲区中直到找到个质数  程序结束。判断一个数N是否是质数的一种算法是:将N顺序与~N的数相除 若每次除法的余数均不等于则该数是质数。注意:的除法支持双字除以字字除以字节本题中可以选择字除以字节。正确结果为:BDD(十六进制数)【实验原理】找出前十个质数,质数只能被和其自身整除但考虑到如果从开始一个一个的除的算法效率太低很多已经是合数的作为除数是浪费的故该算法用每一个数除以已经判断出来的质数(均小于该数)如果不能整除则说明该数是质数能整除说明该数不是质数继续进行下一个判断。【程序框图】【程序源代码】NEQUSTRDISPMACROPOSMOVDX,OFFSETPOSMOVAH,HINTHENDMNUMTOSTRMACRONUM,POSMOVAX,NUMMOVSI,OFFSETPOSADDSI,LENGTHPOS从最后开始(不考虑字符串结束符"$")存放个字符CALLWORDTOSTRENDMDATASSEGMENTNUMBERDWNDUP()LASTDWNUMNOWDWSTRDB"Thefirsttenprimenumbersareasfollows:",DH,AH,"$"STRDB"PRESSANYKEYTOCONTINUE","$"STRNODBDUP(""),"$"STRPRIMEDBDUP(""),"$" HCHHDBDH,AH,"$"DATASENDSSTACKSSEGMENTSTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKS,ES:DATASSTART:MOVAX,DATASMOVDS,AXMOVES,AXMOVAX,STACKSMOVSS,AXMOVSI,OFFSETNUMBER质数数组首地址MOVBX,MOVNUMBERSIBX,第一个质数为MOVLAST,最后一个质数地址MOVDX,第一个质数是MOVNUMNOW,质数计数LOOP:INCDX往后查找MOVBX,MOVCX, LOOP:  判定DX中数据是否是质数PUSHDX 保存现场,防止除法运算带来的改变MOVAX,DXMOVDX,ADDSI,CX求出作为除数的质数的相对位移MOVBX,NUMBERSI从质数集里读取质数ADCSI,CX还原SIINCCXINCCX CX自加DIVBXDX<(DX:AX)(BX)余数CMPDX,POPDXJZLOOP除尽则表示该数不是质数继续查找下一个CMPBX,DXJBLOOP如果除数小于被除数则增大除数继续做除法ADDLAST,相当于指针往后移动一个字的单位长度MOVBX,LASTMOVNUMBERSIBX,DX将找到的质数存入数组基址变址寻址ADDNUMNOW,质数计数加CMPNUMNOW,N得到N个质数则结束JNZLOOP否则继续查找MOVNUMNOW,输出结果MOVDI,OFFSETNUMBERSTRDISPSTRDISPLAY:NUMTOSTRNUMNOW,STRNOMOVAX,DS:DINUMTOSTRAX,STRPRIMESTRDISPSTRPRIME输出质数STRDISPHCHHINCDIINCDIADDNUMNOW,CMPNUMNOW,NJBEDISPLAYSTRDISPSTR等待键盘输入使程序不会立即退出MOVAH,HINTHMOVAH,CHINTH子程序WORDTOSTR将AX中数字转换成个字符的字符串,存入SI为首地址的存储单元里WORDTOSTRPROCFARPUSHSIMOVCX,设置循环次数NEXTDIGIT:MOVDX,MOVBX,CMPAX,JZBLANKDIVBXADDDX,H将得到的每位数字转换为对应的ASCII码SETCHAR:MOVSI,DLDECSIMOVDX,LOOPNEXTDIGITPOPSICMPBYTEPTRSI,HJZZERORETZERO:MOVBYTEPTRSI,HRETBLANK:MOVDL,HJMPSETCHARWORDTOSTRENDPCODESENDSENDSTART【程序运行结果】实验:调试教材P~例的程序(设N=)跟踪IP变化观察堆栈的变化,理解子程序递归调用中程序执行的流程以及帧信息的组成。(注BP的变化)。【实验原理】可以用递归算法:N!=Nx(N)!=Nx(N)x(N)!=!=由此可见求N!可以用递归子程序实现每次调用时入口参数为N以便求(N)!用。当N减为时有!=的结果因而N=作为递归调用的约束条件用来控制退出递归调用的时间。然后在返回时将每次递归调用调用的入口参数相乘:Nx(N)x(N)xx,既得最终结果。【程序框图】【程序源代码】FRAMESTRUCSAVEBPDWSAVEIPDWSAVECSDWSAVEN DWSAVEREXDWFRAMEENDSDISPstrMACROSTRXMOVAH,HMOVDX,OFFSETSTRXINTHENDMBINTODECMACROBINNUM,STRADDRLOCALP,PMOVDX,MOVAX,BINNUMMOVDI,OFFSETSTRADDRADDDI,MOVCX,MOVBX,P: DIVBXOR DL,HMOVDS:DI,DLDECDIMOVDX,CMPAX,JZ PLOOPPP: ENDMDSEG SEGMENTN   DWRESULTDWSTR DBDH,AH,"Pleaseinputnumber(~):$"STR DB"!="NFACTDBDUP("")DB  DH,AH,"$"DSEG ENDSSSEG SEGMENTstackDW DUP()TOSLABELWORDSSEG ENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEG,SS:SSEGSTART:MOVAX,SSEGMOVSS,AXMOVSP,OFFSETTOSMOVAX,DSEGMOVDS,AXMOVBX,OFFSET RESULTPUSHBXERR:DISPstrSTRMOVAH,HINTHCMPAL,HJB ERRCMPAL,HJA ERRANDAL,FHMOVAH,MOVN,AXMOVBX,NPUSHBXCALLFARPTRFACTBINTODECRESULT,NFACTDISPstrSTRMOVAH,CHINTHFACT PROC FARPUSH BPMOV BP,SPPUSH BXPUSH AXMOV BX,BPSAVEREXMOV AX,BPSAVENCMP AX,JE  DONEPUSH BXDEC AXPUSH AXCALL FARPTRFACTMOV BX,BPSAVEREXMOV AX,BXMUL BPSAVENJMP SHORTRETURNDONE:  MOV AX,RETURN: MOV BX,AXPOP AXPOP BXPOP BPRET FACT ENDPCSEGENDSEND START【程序运行结果】FACTIP跳转可用如下图表示:主程序观察堆栈情况:与书中P页情况相符合阶阶乘堆栈示意图(IP)AXBX(BP)(IP)RESULTADDR(IP)AXBX(BP)(IP)RESULTADDR(IP)AXBX(BP)(IP)RESULTADDRAX(IP)AXBX(BP)(IP)(DS)N=RESULTADDR 实验:编写一个通用多字节数相加的宏定义并调用它实现多字节数的加法注意编时宏调用被展开的情况。(提示:用MASM命令汇编时加选项-L在生成OBJ文件时同时生成LST文件观察LST列表文件可以看到宏展开的情况)【实验原理】多字节数的加法就是一个迭代过程。运用调用多字节相加的宏定义可以很简单的实现加法。宏定义中运用间接寻址用进位标志记录每字节的进位并在下一字节的加法中加上进位标志以达到多字节数加法的运算效果。【程序框图】【程序源代码】NEQU       定义多字节的字节数ADDMBMACROM,M,M 宏定义MOVSI,OFFSETMMOVDI,OFFSETM读取两个多字节数字的首地址MOVCX,MCLC  L:MOVAL,DIADCSI,AL   当前位的两个数相加存在M的地址中INCSIINCDI     两个数的地址均自加取下一个数进行运算LOOPLENDMDATASSEGMENTORGHMBDBNDUP(H)ORGHMBDBNDUP(H) DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXADDMBMB,MB,N 引用宏定义计算多字节数MOVAH,CHINTHCODESENDSENDSTART【程序运行结果】实验:编写程序:屏幕显示“Password:”随后从键盘读入字符串并比较这个字符串与程序内部设定的字符串。若二者相同则显示“Hello!”否则显示“Sorry!”注意:要求键盘输入字符不能直接回显在显示器上而要用*号代替。【实验原理】首先字符串“PASSWORD:”输出到屏幕上然后利用中断的H号功能逐个读入字符并在屏幕上显示“*”将字符存入相应的存储单元中直到读入的字符为回车符。之后先判断输入字符串与密码是否等长不等长直接输出“SORRY!”若相等则逐个字符比较全部相等则输出“HELLO!”,否则输出“SORRY!”。【程序框图】【程序源代码】DATASEGMENTPASSWDB'PASSWORD:',DH,AH,'$'提示输入密码的字符串DAT DB''        密码DAT DBDUP()       用来存放输入的字符串STR DB'HELLO!',DH,AH,'$' 密码正确输出的字符串STR DB'SORRY!',DH,AH,'$' 密码错误输出的字符串DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXXOR AX,AXMOV DI,OFFSETDATMOV SI,OFFSETDATLEA DX,PASSWMOV SI,MOV AH,HINT HINPUT:MOV AH,H 系统功能调用的H号功能:直接控制台输入(无回显)INT HCMP AL,DH 回车符的ASCII为DH检测到DH标志字符串已输入完毕JZ CHECK  PUSHAX   若字符串未读入完将AX压入堆栈暂存输入的字符MOV DL,'*' 同时执行系统功能调用的H号功能:字符显示。MOV AH,H 显示一个“*”至屏幕上INT HPOP AX   AX出栈将当前读入的字符存入存储单元DATSI中MOV DATSI,ALINC SI   SI自增进行字符循环读入JMP INPUTCHECK:CMP SI,  判断输入的密码字数与给定密码是否相同。JNE SORRYAGAIN:DEC SI   将DAT和DAT中的字符逐个比较不相等则跳出循环MOV BL,DATSIMOV AL,DATSICMP BL,ALJE AGAIN  相等则继续比较下一个字符直到结束。INC SICMP SI,  根据循环执行的次数判断两字符串是否相等JNE SORRYHELLO:MOV DL,AH MOV AH,H INT HLEA DX,STR  密码输入正确输出字符串HELLO!MOV AH,HINT HJMP DONESORRY:MOV DL,AH MOV AH,H INT HLEA DX,STR  密码输入错误输出字符串SORRY!MOV AH,HINT HDONE: MOV AH,CHINT HCODEENDSENDSTART【程序运行结果】()输入密码正确时(输入)()输入密码错误时(输入)四、实验总结【实验中遇到的问题】实验二的程序编写难度较大要对程序的流程走向有清晰的认识分支程序的跳转和子程序的调用处以及字符串的输入输出都曾经出现过错误。【实验收获与心得】汇编语言作为一种以处理器指令系统为基础的低级程序设计语言可以直接有效的控制计算机硬件。汇编语言主要是在处理器的寄存器内实现逻辑与算术运算指令较为复杂语句繁琐。此次的程序设计主要是熟悉汇编的语法语义及编程规则题目不太复杂涉及到了宏指令伪指令循环语句递归调用等。练习编写较复杂汇编语言程序时程序框图的绘制。子程序定义与调用参数传递的方法。了解宏指令的定义与调用并与子程序定义与调用进行比较。掌握利用软件中断实现DOS系统调用的方法。程序的执行过程中可以实行单步调试过程清晰的观察和分析寄存器内存中地址和数据的变化所产生的一些错误主要是由于定义的时候不规范产生的。程序的执行结果之类的跟事先的流程图所显示的基本一样。此次实验对于我们熟悉汇编语句语法和编程软件及调试过程都有很大帮助。对于汇编语言还是应该熟悉底层硬件结构然后再实验中不断提高。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/46

西交大微机原理与接口技术实验报告

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利