微机实验报告二.docx
- 文档编号:20155986
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:20
- 大小:279.25KB
微机实验报告二.docx
《微机实验报告二.docx》由会员分享,可在线阅读,更多相关《微机实验报告二.docx(20页珍藏版)》请在冰豆网上搜索。
微机实验报告二
微机原理实验报告
实验二
班级:
2012级信息工程(7)班
姓名:
学号:
序号:
评阅分数:
微机实验二
一、实验目的
1、熟悉80X86基本指令集。
2、掌握汇编语言源程序的编写。
3、掌握结构化程序设计三大结构的程序设计。
4、掌握汇编程序的动态调试。
二、开发环境
未来汇编、debug
三、实验题目
1、编程将以‘$’结束的字符串中的小写字母改为大写字母。
①已知数据段的定义:
datasegment
org2000h
str1db‘Aedc123!
*sdeDIO71$’
countequ$-str1
org3000h
str2dbcountdup(?
)
dataends
②画流程图
不是
是
代码:
datasegment
org2000h
str1db'Aedc123!
*sdeDIO71$'
countequ$-str1
org3000h
str2dbcountdup(?
)
dataends
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
STARTPROCFAR
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
LEASI,str1;取str1首地址
LEADI,str2;取str2首地址
MOVCX,count
AA:
MOVAL,[SI]
CMPAL,61H;判断是否为小写字母
JBnext
CMPAL,7AH
JAnext
SUBAL,20H;将小写字母转换为大写
MOV[DI],AL;将非小写字母放入str2中
next:
MOV[DI],AL
INCSI
INCDI
LOOPAA
RET
STARTENDP
CODEENDS
ENDSTART
结果:
1.
2.
③debug调试:
修改str1字符串的值,运行看结果。
结果:
1.
2.
问题:
1.未注意到LOOP循环的结束条件是CX为0,故设计时应该用MOVECX,COUNT这样的语句,执行一次自减一,直到CX为0不执行循环。
2.Loop循环中出现问题,应该把INCSI和INCDI放在循环中比较语句后
3.比较后直接写的next语句,忘记还要执行一个MOV[DI],AL,从而导致输出一直为0.
2、有一个字节型数组,求最大值、最小值和平均值:
1)作为无符号数,2)作为带符号。
①已知数据段的定义:
datasegment
org2000h
numdb12h,95h,0f1h,0c2h,82h,2h,10h,34h
countdb$-num
org3000h
res1db3dup(?
);storeunsigned
org4000h
res2db3dup(?
);storesigned
dataends
②画流程图
代码:
datasegment
org2000h
numdb12h,95h,0f1h,0c2h,82h,2h,10h,34h
countequ$-num
org3000h
res1db3dup(?
);storeunsigned
org4000h
res2db3dup(?
);storesigned
dataends
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
STARTPROCFAR
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
LEASI,num
LEADI,res1
MOVCX,count-1
MOVAL,[SI]
;求无符号数最大值
a:
INCSI
CMPAL,[SI]
JAnext1
MOVAL,[SI]
next1:
LOOPa
MOV[DI],AL
;求无符号数最小值
LEASI,num
MOVCX,count-1
MOVAL,[SI]
INCDI
b:
INCSI
CMPAL,[SI]
JBnext2
MOVAL,[SI]
next2:
LOOPb
MOV[DI],AL
;求无符号数平均值
LEASI,num
LEADI,RES1
MOVCX,count
XORBX,BX
mean:
MOVAL,[SI];将数放在al
CWD;扩为32位,跳过符号
ADDBX,AX
INCSI
LOOPmean
MOVAX,BX;将求和结果放回al
MOVcx,count
DIVcx
MOV[DI][2],AL
;有符号数最大值
LEASI,num
LEADI,res2
MOVCX,count-1
MOVAL,[SI]
a2:
INCSI
CMPAL,[SI]
JGnext3
MOVAL,[SI]
next3:
LOOPa2
MOV[DI],AL
;求有符号数最小值
LEASI,num
MOVCX,count-1
MOVAL,[SI]
INCDI
b2:
INCSI
CMPAL,[SI]
JLnext4
MOVAL,[SI]
next4:
LOOPb2
MOV[DI],AL
;求有符号数的平均值
LEASI,num
XORDI,DI
XORBX,BX
MOVCX,8
mean2:
MOVAL,[SI]
CBW;先扩成16位
CWD;再将符号位扩充至dx
ADDBX,AX
ADCDI,DX;符号位无进位相加,只保留0或1
INCSI
LOOPmean2
MOVAX,BX
MOVDX,DI
MOVCX,8
IDIVCX;有符号相除
LEADI,RES2
MOV[DI][2],AL
RET
STARTENDP
CODEENDS
ENDSTART
结果:
1.无符号数
2.有符号数
出现的问题:
1.未注意到数据比较时比较的次数为COUNT-1次。
第一次用COUNT次进行循环时,会使最小值为0.
2.在求平均值是未注意到要除以count次,不是count-1
3.在求有符号数的平均值时在最开始就对res2取址:
LEADI,RES2,忽略了在后面一步需要用到ADCDI,DX,导致最后一步MOV[DI][2],AL时出错,应该把LEADI,RES2放在ADCDI,DX之后才不会对所存的数产生影响
4.每一次大段操作完记得INCSI,使储存向下一个地址进行。
5.最开始时发现有符号数求平均与无符号数相等,修改为有符号数求和时要先扩为字,再扩为双字,这样符号位才不会遗失。
6.求和时di使用前未清零,导致错误相加,修改后先将di清零再相加。
3、数码转换:
将字数据转换为ASCII码表示的十进制数。
字数据的值域为0~65535,最多可转换为五位十进制数。
例如:
字数据为0ffffh,则转换为:
‘65535’
①已知数据段的定义:
datasegment
org2000h
numdw65535
org2010h
dataends
②画流程图
循环5次
代码:
datasegment
org2000h
numdw65535
org3000h
num1dw10000,1000,100,10,1;定义一个被除数数组,偏移地址为3000h
org2010h
resdb5dup(?
)
dataends
STACKSSEGMENT
DB100DUP(?
)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATA,SS:
STACKS
START:
MOVAX,DATA
MOVDS,AX
LEASI,num
MOVAX,[SI]
LEADI,res
MOVcx,5
LEASI,num1
A:
MOVBX,[SI]
INCSI
INCSI
DIVBX;AX/BX
ADDAL,0030H;将al转成ASCII码
MOV[DI],AL
MOVAX,DX;将余数给ax
MOVDX,0000H;将dx清零
INCDI
LOOPA
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
Debug调试
1.在2010h~2014h存储单元为:
36,35,35,33,35。
2)修改num,运行看结果。
修改num为46728
结果:
出现的问题:
1.要让SI指向下一个余数必须自增2,即要用到两次INCSI;
INCSI
2.每次循环时要取出余数作为下一次的被除数,同时将寄存器清零
4、数码转换:
将字数据转换为ASCII码表示的十六进制数。
字数据的值域为0~65535,最多可转换为四位十六进制数。
例如:
字数据为0ffffh,则转换为:
‘FFFF’
①已知数据段的定义:
datasegment
org2000h
numdw54A8h
org2010h
resdb4dup(?
)
dataends
②画流程图
循环
4次
是不是
代码:
datassegment
org2000h
numdw54A8H
org2010h
resdb4dup(?
)
org3000h
num1dw1000h,100h,10h,1h;定义一个被除数数组,偏移地址为3000h
datasends
STACKSSEGMENT
DB100DUP(?
)
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
LEASI,num
MOVAX,[SI]
LEADI,res
MOVcx,4
LEASI,num1
A:
MOVBX,[SI]
INCSI
INCSI
DIVBX;AX/BX
CMPAL,10;比较al与10的大小
JBNEXT
;AL大于10
ADDAL,37h;将al转成ASCII码
MOV[DI],AL
MOVAX,DX;将余数给ax
MOVDX,0000H;将dx清零
INCDI
LOOPA
JMPEXIT
NEXT:
AL小于10
ADDAL,30h;将al转成ASCII码
MOV[DI],AL
MOVAX,DX;将余数给ax
MOVDX,0000H;将dx清零
INCDI
LOOPA
JMPEXIT
EXIT:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
Debug调试:
1)查看运行结果应该为:
在2010h~2013h存储单元为:
35,34,41,38。
2)修改num,运行看结果。
修改num为5C1F
结果:
问题:
1.完整执行完next后没有跳到exit,导致运行不正确,加入JMPEXIT后程序运行正常。
总结:
CBW、CWD的用法;
Loop的用法;
附加段的用法
堆栈的用法
Dos中21h的调用:
输出字符及结束
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 实验 报告