微机原理与汇编语言程序设计报告.docx
- 文档编号:24562615
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:26
- 大小:434.85KB
微机原理与汇编语言程序设计报告.docx
《微机原理与汇编语言程序设计报告.docx》由会员分享,可在线阅读,更多相关《微机原理与汇编语言程序设计报告.docx(26页珍藏版)》请在冰豆网上搜索。
微机原理与汇编语言程序设计报告
微机原理与汇编语言
程序设计报告
所在学院:
计算机工程学院
专业:
计算机科学与技术(网络工程)
班级:
11计3Z
姓名:
黄申祥
学号:
11141313
2013年6月1日
1、程序功能:
1.从键盘输入N个带符号数(N值也从键盘输入,N<=65535),带符号数为16位二进制数范围;
2.找出这N个数中的最大值和最小值,并且显示出来;
3.计算这N个数的平均值,并且显示出来。
2、程序设计总体思路
程序按功能所属主要分为7个模块,7个模块分别为
一个主程序;
SHOW——欢迎子程序;
NUM——取数据个数子程序;
READ——数据输入子程序;
WRITE——数据显示子程序;
MAXMIN——求数据最大最小值子程序;
MEAN——求数据平均值子程序。
另外,为了更好地输入输出显示,还设计了DPCRLF——光标回车换行子程序、NDPCRLF——多个空格输出显示子程序。
整个程序通过主程序中相关指令调用各个子程序,实现各个功能,这种模块化的设计方法不仅简化了主程序,还可以重复利用已有子程序,提高编程效率。
3、程序分析
程序运行之初,首先展现在屏幕上的是程序欢迎界面。
主程序通过调用SHOW——欢迎子程序以实现此功能。
欢迎界面之后,程序提示输入数据个数N,通过调用NUM——取数据个数子程序由此得到执行READ——数据输入子程序的次数,通过多重循环执行此子程序以取得N个数据。
当数据输入完成、顺利保存后,通过调用BIOS功能实现对屏幕原有字句进行清除,调用WRITE——数据显示子程序将用户之前输入的数据显示在屏幕上,数据的输入显示格式通过调用NDPCRLF——多个空格输出显示子程序实现。
进行最大最小值判断,通过调用MAXMIN——求数据最大最小值子程序,利用循环取得各个数据与假设的最大最小值进行比较,满足一定条件后将其替换。
计算平均值,通过调用MEAN——求数据平均值子程序,利用循环累加各个数据并除以N,求得最终结果。
4、程序流程图
1.主程序流程图
2.SHOW——欢迎子程序流程图
3.NUM——取数据个数子程序流程图
4.READ——数据输入子程序流程图
5.WRITE——数据显示子程序流程图
6.
MAXMIN——求数据最大最小值子程序流程图
7.MEAN——求数据平均值子程序流程图
5、源程序列表文件内容
Microsoft(R)MacroAssemblerVersion6.1106/02/1301:
24:
33
tempfile.asmPage1-1
0000DSEGSEGMENT;数据段
000077656C636F6DMESS0DB'welcometothisprogram!
----HUANGSHENXIANG'
6520746F2074
686973207072
6F6772616D21
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202020202020
202D2D2D2D48
55414E472053
48454E584941
4E47
00C83D3D3D3D3D3DMESS1DB'================Welcometothisprogram!
================','$'
3D3D3D3D3D3D
3D3D3D3D5765
6C636F6D6520
746F20746869
732070726F67
72616D213D3D
3D3D3D3D3D3D
3D3D3D3D3D3D
3D3D24
0101506C65617365MESS2DB'PleaseinputN(N<=65535):
','$'
20696E707574
204E284E3C3D
363535333529
3A24
011B506C65617365MESS3DB'Pleaseinputnumbers:
','$'
20696E707574
206E756D6265
72733A24
01310A0D0A0D596FMESS4DB0AH,0DH,0AH,0DH,'Yourinputare:
','$'
757220696E70
757420617265
3A24
01450A0D54686520MESS5DB0AH,0DH,'TheMAXis:
','$'
4D4158206973
3A24
01530A0D54686520MESS6DB0AH,0DH,'TheMINis:
','$'
4D494E206973
3A24
01610A0D54686520MESS7DB0AH,0DH,'TheAVERAGEis:
','$'
415645524147
452069733A24
017300DISPMODDB?
01740000COUNTDW?
017603E8[ARRAYDW1000DUP(0)
0000
]
09460000WTEMPDW?
09480000MAXAYDW?
094A0000MINAYDW?
094CDSEGENDS
0000SSEGSEGMENTSTACK;堆栈段
00000080[DB80HDUP(0)
00
]
0080SSEGENDS
0000CSEGSEGMENT;代码段
ASSUMEDS:
DSEG,SS:
SSEG,CS:
CSEG
0000B8----RSTART:
MOVAX,DSEG
00038ED8MOVDS,AX
0005FCCLD;CLD使DF复位,即DF=0,STD使DF置位,即DF=1
0006E801B2CALLSHOW;调用显示欢迎界面
0009BA00C8RMOVDX,OFFSETMESS1;显示欢迎横幅于第二页
000CB409MOVAH,09H
000ECD21INT21H
0010E8018CCALLDPCRLF
0013E80189CALLDPCRLF
0016BA0101RMOVDX,OFFSETMESS2;输入元素个数
0019B409MOVAH,09H
001BCD21INT21H
001DE8009CCALLNUM;调用INPUT子程序
00208B0E0174RMOVCX,COUNT;将输入的元素个数值N传递给CX计数寄存器
0024BB0176RMOVBX,OFFSETARRAY
0027BA011BRMOVDX,OFFSETMESS3;输入N个元素
002AB409MOVAH,9H
002CCD21INT21H
002EE8016ECALLDPCRLF
0031E80094AGAIN1:
CALLREAD;调用READ子程序,输入元素
00348907MOV[BX],AX;将出口参数存放到数据缓冲区
003643INCBX
003743INCBX
0038E80164CALLDPCRLF;调用DPCRLF子程序,光标回车换行以便输入下一元素
003BE2F4LOOPAGAIN1
003DB003MOVAL,3H
003FCD10INT10H
00418B0E0174RMOVCX,COUNT
0045BB0176RMOVBX,OFFSETARRAY
0048BA00C8RMOVDX,OFFSETMESS1;显示欢迎横幅于第二页
004BB409MOVAH,09H
004DCD21INT21H
004FBA0131RMOVDX,OFFSETMESS4
0052B409MOVAH,09H
0054CD21INT21H
0056E80146CALLDPCRLF
00598B07AGAIN2:
MOVAX,[BX]
005BA30946RMOVWTEMP,AX;将入口参数存放到共享变量
005EE800A8CALLWRITE;调用WRITE子程序,显示一个元素
006183C302ADDBX,2
0064E80149CALLNDPCRLF;调用NDPCRLE子程序,光标回车换行以便显示下一个数据
0067E2F0LOOPAGAIN2;执行COUNT次循环
0069B402MOVAH,2
006BB20DMOVDL,0DH
006DCD21INT21H
006FB20AMOVDL,0AH
0071CD21INT21H
00738B0E0174RMOVCX,COUNT
0077B80176RMOVAX,OFFSETARRAY
007AE800CFCALLMAXMIN;调用MAXMIN子程序
007DBA0145RMOVDX,OFFSETMESS5
0080B409MOVAH,09H
0082CD21INT21H
0084A10948RMOVAX,MAXAY
0087A30946RMOVWTEMP,AX
008AE8007CCALLWRITE;调用WRITE子程序输出MAXAY
008DBA0153RMOVDX,OFFSETMESS6
0090B409MOVAH,09H
0092CD21INT21H
0094A1094ARMOVAX,MINAY
0097A30946RMOVWTEMP,AX
009AE8006CCALLWRITE;调用WRITE子程序输出MINAY
009DBA0161RMOVDX,OFFSETMESS7
00A0B409MOVAH,09H
00A2CD21INT21H
00A4A10174RMOVAX,COUNT
00A750PUSHAX
00A8B80176RMOVAX,OFFSETARRAY
00AB50PUSHAX
00ACE800C3CALLMEAN
00AF83C404ADDSP,4
00B2A30946RMOVWTEMP,AX
00B5E80051CALLWRITE;调用WRITE子程序输出平均值
00B8B44CMOVAH,4CH
00BACD21INT21H
00BCNUMPROC
00BC50PUSHAX
00BDE80008CALLREAD
00C0A30174RMOVCOUNT,AX
00C3E800D9CALLDPCRLF
00C658POPAX
00C7C3RET
00C8NUMENDP
00C8READPROC;输入有符号十进制数的通用子程序:
READ
00C853PUSHBX;出口参数:
AX=补码表示的二进制数值
00C951PUSHCX;负数用“-”引导,数据范围是+32767~-32768
00CA52PUSHDX
00CB33DBXORBX,BX;BX保存结果
00CD33C9XORCX,CX;CX为正负标志,0为正,-1为负
00CFB401MOVAH,1;输入一个字符
00D1CD21INT21H
00D33C2BCMPAL,'+';是“+”,继续输入字符
00D57407JZREAD1
00D73C2DCMPAL,'-';是“-”,设置-1标志
00D97507JNZREAD2
00DBB9FFFFMOVCX,-1
00DEB401READ1:
MOVAH,1;继续输入字符
00E0CD21INT21H
00E23C30READ2:
CMPAL,'0';不是0~9之间的字符,则输入数据结束
00E47216JBREAD3
00E63C39CMPAL,'9'
00E87712JAREAD3
00EA2C30SUBAL,30H;是0~9之间的字符,则转换为二进制数
;利用移位指令,实现数值乘10:
BX<-BX*10
00ECD1E3SHLBX,1
00EE8BD3MOVDX,BX
00F0D1E3SHLBX,1
00F2D1E3SHLBX,1
00F403DAADDBX,DX
;
00F6B400MOVAH,0
00F803D8ADDBX,AX;已输入数值乘10后,与新输入数值相加
00FAEBE2JMPREAD1;继续输入字符
00FC83F900READ3:
CMPCX,0;是负数,进行求补
00FF7402JZREAD4
0101F7DBNEGBX
01038BC3READ4:
MOVAX,BX;设置出口参数
01055APOPDX
010659POPCX
01075BPOPBX
0108C3RET;子程序返回
0109READENDP
0109WRITEPROC;显示有符号十进制数的通用子程序:
WRITE
010950PUSHAX;入口参数:
共享变量WTEMP
010A53PUSHBX
010B52PUSHDX
010CA10946RMOVAX,WTEMP;取出显示数据
010F85C0TESTAX,AX;判断数据是零、正数或负数
01117508JNZWRITE1
0113B230MOVDL,'0';是零,显示“0”后退出
0115B402MOVAH,2
0117CD21INT21H
0119EB2DJMPWRITE5
011B790CWRITE1:
JNSWRITE2;是负数,显示“-”
011D8BD8MOVBX,AX;AX数据暂存于BX
011FB22DMOVDL,'-'
0121B402MOVAH,2
0123CD21INT21H
01258BC3MOVAX,BX
0127F7D8NEGAX;数据求补(绝对值)
0129BB000AWRITE2:
MOVBX,10
012C53PUSHBX;10压入堆栈,作为退出标志
012D83F800WRITE3:
CMPAX,0;数据(商)为零,转向显示
0130740AJZWRITE4
01322BD2SUBDX,DX;扩展被除数DX,AX
0134F7F3DIVBX;数据除以10:
DX.AX/10
013680C230ADDDL,30H;余数(0~9)转换为ASCII码
013952PUSHDX;数据各位先低位后高位压入堆栈
013AEBF1JMPWRITE3
013C5AWRITE4:
POPDX;数据各位先高位后低位弹出堆栈
013D80FA0ACMPDL,10;是结束标志10,则退出
01407406JEWRITE5
0142B402MOVAH,2;进行显示
0144CD21INT21H
0146EBF4JMPWRITE4
01485AWRITE5:
POPDX
01495BPOPBX
014A58POPAX
014BC3RET;子程序返回
014CWRITEENDP
014CMAXMINPROC
014C56PUSHSI
014D53PUSHBX
014E8BF0MOVSI,AX
015049DECCX;减1后取得循环次数
01518B04MOVAX,[SI];取出第一个元素给AX,AX用于暂存最大值
01538BD8MOVBX,AX;取出第一个元素给BX,BX用于暂存最小值
015583C602MAXCK:
ADDSI,2
01583904CMP[SI],AX;与下一个数据比较
015A7E04JLEMINCK
015C8B04MOVAX,[SI];AX取得更大的数据
015EEB06JMPNEXT;[si]已为大值,故不必再进行小值比较
0160391CMINCK:
CMP[SI],BX
01627D02JGENEXT
01648B1CMOVBX,[SI];BX取得更小的数据
0166E2EDNEXT:
LOOPMAXCK;计数循环
0168A30948RMOVMAXAY,AX;保存最大值
016B891E094ARMOVMINAY,BX;保存最小值
016F5BPOPBX
01705EPOPSI
0171C3RET;子程序返回
0172MAXMINENDP
0172MEANPROC;计算16位有符号数平均值子程序:
MEAN
017255PUSHBP;入口参数:
顺序压入数据个数和数据缓冲区偏移地址
01738BECMOVBP,SP;出口参数:
AX=平均值
017553PUSHBX;保护寄存器
017651PUSHCX
017752PUSHDX
017856PUSHSI
017957PUSHDI
017A8B5E04MOVBX,[BP+4];从堆栈中取出缓冲区偏移地址->BX
017D8B4E06MOVCX,[BP+6];从堆栈中取得数据个数->CX
018033F6XORSI,SI;SI保存求和的低16位值
01828BFEMOVDI,SI;DI保存求和的高16位值
01848B07MEAN1:
MOVAX,[BX];取出一个数据->AX
018699CWD;符号扩展->DX
018703F0ADDSI,AX;求和低16位
018913FAADCDI,DX;求和高16位
018B43
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 汇编语言 程序设计 报告