微机实验报告.docx
- 文档编号:8187696
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:18
- 大小:132.48KB
微机实验报告.docx
《微机实验报告.docx》由会员分享,可在线阅读,更多相关《微机实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
微机实验报告
实验1
1.实验目的及要求:
已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。
试编制一程序,把既在A中又在B中出现的整数存放于数组C中。
2.实验步骤:
题目要求将A和B中同时出现的数字放入C中,则需要两个嵌套的循环,外层循环做15次,遍历A中所有的数字;而A中的每一个数字,与B中的数字逐一进行比较,是一个最多做20次得内层循环,要么找到相同的数跳回外层循环,要么20个全比较了也没找到相同的数字,然后跳回外层循环。
每找到一个相同的数,将之放入C中。
3.实验内容:
流程图:
代码:
……
adw15dup(?
)
bdw20dup(?
)
cdw15dup(?
)
……
movsi,0;si为数组A的指针
movbx,0;bx为数组C的指针
movcx,15
loop1:
movdi,0;di为数组B的指针
pushcx
movcx,20
movax,a[si]
loop2:
cmpb[di],ax
jneno
movc[bx],ax
addbx,2
jmpnext
no:
adddi,2
looploop2
next:
addsi,2
popcx
looploop1
4.实验结果:
A、B、C三个数组初始化为:
ADB31H,32H,33H,34H,35H,36H,37H,38H,39H,40H,
41H,42H,43H,44H,45H
BDB31H,32H,33H,34H,35H,46H,47H,48H,49H,50H,
51H,52H,53H,54H,55H,
56H,57H,58H,59H,60H
TDB15DUP('*'),'$'
5.实验总结分析:
使用多重循环可以解决更为复杂的问题。
B中找出是否有相同的数,当然需要将A中的那个数逐一与B中的数进行比较,这里需要一个循环。
而要将所有相同数找出,则必定要遍历A,这里又需要一个循环。
所以,这个题目必定是一个嵌套的双重循环。
实验2
1.实验目的及要求:
统计BLOCK1和BLOCK2两个单元数据中,对应位不同的有多少位。
2.流程图:
3.代码:
DATASSEGMENT
BLOCK1DB'123456789'
BLOCK2DB'987456123'
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVBX,0
MOVCX,9
LEASI,BLOCK1
LEADI,BLOCK2
LOP:
LODSB
CMPAL,[DI]
JE NEXT
INCBX
NEXT:
INCDI
DECCL
JNZLOP
MOVAH,2
ADDBL,30H
MOVDL,BL
INT21H;
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
5.运行结果:
6
6.实验心得与体会
实验三:
1.实验目的及要求:
编写一个汇编语言程序,要求从键盘接收一个四位16进制数,并显示出与它等值的二进制数
2.实验设计分析
将接收到的数转成16进制数,将这个数保存在一个通用寄存器中(如AX),然后对AX循环做16次SHL,由carry标志寄存器的状态来判断显示0/1。
十六位二进制数保存在BX中,对BX中的二进制数循环左移,每次移一位,然后把BL中的二进制数送给AL,再对AL的前7位进行屏蔽,只留一位原本是最高位的那位二进制数,它要么为1,要么为0。
然而把AL中的这位二进制数转换为十进制数,并且输出,由于AL高7位都为0,所以转换位十进制后,然后要么为1,要么为0,并且与那位二进制数相对应。
这样循环做16次,就把整个BX中的二进制数都显示出来。
3.流程图:
N
N
Y
4.代码:
DATASEGMENT
STR1DB'INPUTAHEXNUM:
$'
HEXDB5;计划输入的字符个数(含回车符)
NNNDB0;存放实际输入的字符个数
DB5DUP(?
)
BINDW?
;输入数字的二进制形式的存放单元
ERRDB0AH,0DH,'ERROR!
'
DB0AH,0DH,'IHAVENOTIMETOPLAYWITHYOU!
$'
STR2DB13,10,'BINARYIS:
$'
DATAENDS
;--------------------------------------------
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?
)
STACKENDS
;--------------------------------------------
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
LEADX,STR1;'INPUTAHEXNUM'
MOVAH,9;显示字符串
INT21H
LEADX,HEX
MOVAH,10;等着输入四位HEX数
INT21H
;---------------------------------------
;下面进行转换
MOVBIN,0;先把二进制数字单元清零
LEASI,HEX+2;取输入字符串的首地址
MOVCH,NNN;取输入字符的个数,用来控制循环处理的次数
CONV:
MOVBL,[SI];取来一个字符
CMPBL,0DH;和回车符进行比较
JZEND0;是,即结束
CMPBL,'0'
JBERROR;小于'0'转移
CMPBL,'F'
JAERROR;大于'F'转移
CMPBL,'9'
JNAA2B;不大于'9',就去变换
CMPBL,'A'
JNBA2B;不小于'A',就去变换
JMPERROR;其它符号都是错误
;---------------------------------------
A2B:
SUBBL,30H;ASC-->BIN
CMPBL,10
JBA2B_END
SUBBL,07H;ASC-->BIN
A2B_END:
;---------------------------------------
MOVBH,0;弄成16位数
PUSHCX
MOVAX,BIN;把原来的数字乘以16
MOVCX,16
MULCX
ADDAX,BX;加上新输入的
MOVBIN,AX;存结果,这就是二进制数
INCSI
POPCX
DECCH;处理次数减一
JNZCONV;非零转移
;---------------------------------------
DISP:
LEADX,STR2;'BINARYIS:
$'
MOVAH,9;显示字符串
INT21H
;---------------------------------------
MOVAX,BIN;取来数字
MOVCX,16;显示16位数
DDDD:
MOVDL,'0';先计划显示0
TESTAX,8000H;测试最高位
JZDDD1
INCDL;非0就显示1
DDD1:
PUSHAX
MOVAH,2;显示DL中的ASCII码
INT21H
POPAX
SHLAX,1;左移
LOOPDDDD;CX-1,非零转移
JMPEND0;16位显示完毕,转到结束
;---------------------------------------
ERROR:
LEADX,ERR
MOVAH,09H;错误信息提示
INT21H
;---------------------------------------
END0:
MOVAH,4CH;返回DOS
INT21H
CODEENDS
;---------------------------------------
ENDSTART
5运行结果
十六进制转化为二进制:
5.实验的心得体会:
我的收获是对进制数转换的原理有了较为清楚地理解,可以解释原来不懂得程序,对各种寄存器的跳转有了一定的了解,同时认识到由于寄存器的数量有限,我们必须用其他的方式来解决,同时可以解决有时候寄存器不够的情况,对应进一步学习汇编有了一定的推动作用,汇编基础有了一定的提高。
通过这个课程设计,我对汇编有了一定的体会,因为汇编语言是可以直接和机器语言联系。
从而使得汇编语言的利用率很高,处理相同的程序比高级语言速度快很多,但是他操作也没有高级语言那么方便,但是总体来说,汇编还是很强大的,他帮助我们很深的理解原来不懂得程序。
实验4
1.实验目的及要求:
编写程序,将一串凌乱的字母按从小到大的顺序排列
2.流程图:
3.代码:
DATASSEGMENT
DATADB'gfed$'
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,1
LOP1:
MOVDI,SI
INCDI
MOVAL,DATA[SI-1]
LOP2:
CMPAL,DATA[DI-1]
JBELOP3
XCHGDATA[DI-1],AL
MOVDATA[SI-1],AL
LOP3:
INCDI
CMPDI,4
JBELOP2
INCSI
CMPSI,3
JBELOP1
SHOW:
MOVAH,9
MOVDX,OFFSETDATA
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验五
一.实验要求:
编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示‘MATCH’,若不相同则显示‘NOMATCH’。
二.流程图:
三.代码:
DSEGSEGMENT
STRING1DB‘Iamastudent.’
STRING2DB‘Iamastudent!
’
YESDB‘MATCH’,0DH,0AH,‘$’
NODB‘NOMATCH’,0DH,0AH,‘$’
DSEGENDS
;--------------------------------------------------------------------------
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:
CSEG,DS:
DSEG,ES:
DSEG
START:
PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
MOVES,AX;给ES赋值
;
BEGIN:
LEASI,STRING1;设置串比较指令的初值
LEADI,STRING2
CLD
MOVCX,STRING2-STRING1
REPECMPSB;串比较
JNEDISPNO
LEADX,YES;显示MATCH
JMPDISPLAY
DISPNO:
LEADX,NO;显示NOMATCH
DISPLAY:
MOVAH,9;显示一个字符串的DOS调用
INT21H
RET
MAINENDP
CSEGENDS;以上定义代码段
;--------------------------------------------------------------------------
ENDSTART
实验六
1.实验目的及要求:
编程从键盘输入一个二位十进制的月份数(01~12),然后显示出相应的英文缩写名
(1)感受和学习子程序的定义与设计方法,完成相应程序设计
(2)学习模块化程序的基本设计方法
(3)进一步感受和学习分支、循环等基本程序结构
(4)进一步感受和学习汇编语言程序的设计方法、语法和技巧
2.流程图
3.代码
DATASSEGMENT
monthDB'Jan'
DB'Feb'
DB'Mar'
DB'Apr'
DB'May'
DB'Jun'
DB'Jul'
DB'Agu'
DB'Sep'
DB'Oct'
DB'Nov'
DB'Dec'
string1DB0DH,0AH,'Inputthemonthnumble(PressENTERtoquit):
$'
BUF1DB0DH,0AH,10DUP(0)
BUF2DB81,?
80DUP(?
)
DATASENDS
STACKSSEGMENT
DB100DUP(0)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
LOP1:
CALLINPUT
CMP[BUF2+2],0DH
JZEXIT
CALLSUB1
CALLOUTPUT
JMPLOP1
EXIT:
MOVAH,4CH
INT21H
INPUTPROCNEAR;字符输入
PUSHDX
LEADX,string1
MOVAH,09H
INT21H
LEADX,BUF2
MOVAH,0AH
INT21H
POPDX
RET
INPUTENDP
OUTPUTPROCNEAR;字符输出
PUSHDX
MOV[DI],'$'
LEADX,BUF1
MOVAH,09H
INT21H
POPDX
RET
OUTPUTENDP
SUB1PROCNEAR
PUSHAX
PUSHBX
PUSHCX
MOVAL,[BUF2+2]
CMPAL,30H
JNZNEXT1
MOVAL,[BUF2+3]
ANDAX,0FH
DECAX
JMPNEXT2
NEXT1:
MOVAL,[BUF2+3]
ANDAX,0FH
ADDAX,0AH
DECAX
NEXT2:
MOVBX,AX
SHLAX,1
ADDBX,AX
MOVSI,BX
LEADI,BUF1
ADDDI,2
MOVCX,3
REPMOVSB
POPCX
POPBX
POPAX
RET
SUB1ENDP
CODESENDS
ENDSTART
3.实验心得与体会
进一步感受和学习分支、循环等基本程序结构。
进一步感受和学习汇编语言程序的设计方法、语法和技巧
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 实验 报告