【参考文档】东华大学微机实验报告答案(软件) (3000字)-优秀word范文 (28页)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!
== 本文为word格式,下载后可方便编辑和修改! == 东华大学微机实验报告答案(软件) (3000字)
目录
实验一 DEBUG的启动及其基本命令的使用实验二内存操作数及寻址方法实
验三汇编语言程序的调试与运行实验四查表程序设计实验五系统功能调用实验六分支程序设计实验七循环程序设计实验八子程序设计实验九综合程序设计实验心得体会参考文献
实验一 DEBUG的启动及其基本命令的使用
源程序:(指导书中给出)
DATA SEGMENT
STRING1 DB 'Move the cursor backward'STRING2 DB 'Move the cursor backward'MESS1 DB 'Match.',13,10,'$'MESS2 DB 'No Match.',13,10,'$' DATA ENDS
STACK SEGMENT STACKDB 40 DUP (?) STACK ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA,ES:DATA,SS:STACK
MAIN PROC FAR START: PUSH DSXOR AX,AX PUSH AX
MOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,STACKMOV SS,AX
LEA SI,STRING1LEA DI,STRING2CLD
MOV CX,25REPZ CMPSBJZ MATCH
LEA DX,MESS2JMP SHORT DISP MATCH: LEA DX,MESS1 DISP:MOV AH,09hINT 21H RET
MAIN ENDP PROGNAM ENDS END START
运行结果:
用DEBUG调试将输出字符串改为‘No Match’
用E指令修改“backward”为“forward”
再次用d命令查看修改结果。

用g命令运行程序
实验二内存操作数及寻址方法
1、(1)程序说明:设堆栈指针SP=201XH,AX=3000H,BX=5000H;请编一程序段将AX和BX的内容进行交换。

请用堆栈作为两寄存器交换内容的中间存储单元,用字处理程序编辑程序。

(2)调试说明:对SP的地址分配不到201X,计算机自动分配为0000,此时我就人为的把堆栈的首地址定义为201X。

(3)写出源程序清单和执行结果:
源程序:
STACK SEGMENT STACK DW 100 DUP(0) STACK ENDS CODE SEGMENT
ASSUME SS:STACK,CS:CODE START:MOV AX,3000H MOV BX,5000H MOV SP,201XH
PUSH AX ;将AX中的内容压栈 MOV AX,BX ;BX中的内容给AX POP BX
MOV AH,4CH INT 21H CODE ENDS
END START
用debug调试结果:
2、程序说明:用masm和link 对以下程序进行汇编和连接,调试程序在DEBUG 调试程序状态下进行。

用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,AX中的内容是什么。

源程序:
DATA SEGMENTORG 0300H
A D
B 12H,23H,34H,45H,56H,67H,78H,89H,9AH DATA ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA START: MOV AX,DATAMOV DS,AX
MOV BX,0300H
MOV AX,0300H ;立即数寻址
MOV AX,[0300H] ;存储器寻址方式中的直接寻址方式MOV AX,[BX] ;寄存器间
接寻址MOV SI,2
MOV AX,0001[BX];基址寻址MOV AX,[BX][SI] ;基址加变址
MOV AX,0001[BX][SI] ;带偏移量的基址加变址MOV AH,4CHINT 21H PROGNAM ENDS END START
用debug调试结果:
实验三算术运算指令
1、程序说明:编写三个完整的汇编语言源程序,完成以下计算。

其中X、Y、Z、R、W均为存放16位带符号数单元的地址。

(1)Z←W+(Z-X)
(2)Z←W-(X+6)-(R+9)
(3)Z←(W*X)/(Y+6),R←余数
2、调试说明:当编译完成后,计算机未能生成.OBJ的文件,经检查错误发生
在ADD使用上,我把两个寄存器操作数同时用在ADD语句里,结果出错了。

把ADD语句稍作写该后,程序运行正确。

3、写出源程序清单和执行结果
本实验我们只做前两个,即:(1)Z←W+(Z-X);(2)Z←W-(X+6)-(R+9)
源程序:
(1) Z←W+(Z-X)
DATA SEGMENT
X DD 0001H
Z DD 0003H
W DD 0005H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA START: MOV AX,DATA
MOV DS,AX
MOV AX,X
MOV BX,Z
SUB BX,AX
MOV AX,W
ADD BX,AX
MOV Z,BX
MOV AH,4CH
INT 21H
CODE ENDS
END START
用debug调试结果:
源程序:
(2)Z←W-(X+6)-(R+9)DATA SEGMENT
X DW 0006H
R DW 003AH
W DW 0110H
Z DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,X
ADD AX,6
MOV BX,R
ADD BX,9
MOV CX,W
SBB CX,AX
SBB CX,BX
MOV Z,CX
MOV AH,4CH
INT 21H
CODE ENDS
END START
用debug调试结果:
实验四查表程序设计
1、程序说明:用查表的方法将一位十六进制数转换成与它相应的ASCII码,并将结果存放到ASCI单元中。

2、调试说明:开始生成.OBJ文件时,调试不成功,以为是程序编译有误,后经再三检查都未发现错误,这时只好从头做检查,结果发现了错误:从本实验有的提示语段中拷贝过来的语句书写有误,即符号的书写为中文书写,以至于整个程序未能通过编译。

把中文书写修改为英文书写后,编译成功。

3、源程序清单和执行结果:
源程序:
DATA SEGMENT
TABLE DB 30H,31H,32H,33H,34H,35H,36H,37H
DB 38H,39H,41H,42H,43H,44H,45H,46H
HEX DB 08H
ASCI DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET TABLE
MOV AL,HEX ;查找对象的下标存在AL中
XLAT
MOV ASCI,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
用debug调试结果:
实验五系统功能调用
1、程序说明:试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。

2、调试说明:在DEBUG显示字符窜时,曾显示乱码,未能按预期显示,经检查发现在编译字符窜时出现错误,因为调用21H中断输出一串字符要求用'$'结尾,
我没用上‘$’。

还有,键盘输入字符是被存放在AX内,当要多次使用AX时应该把输入内容另存一地址
3、源程序清单和执行结果:
源程序:
DATA SEGMENT
DB ?
DATA ENDS
STACK SEGMENT STACK
DB 5 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA, SS:STACK,CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV AH,01H ;从输入端读取字符
INT 21H
SUB AL,20H ;小写转换成大写
MOV DL,AL
MOV AH,02H ;输出字符到终端
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
实验六分支程序设计
1、实验说明:假设有一组数据:5,-4,0,3,100,-51,请编一程序,判断:每个数大于0,等于0,还是小于0;并输出其判断结果。

即:
1 当x>0 当x=0
当x<0
2、调试说明:在最初的程序中,我使用了MOV BX,XX等语句,后来发现像这样的语句在实际使用中有些累赘,于是我便做了修改,简化了汇编语言。

其次,
在调试中,发现符号无法显示的问题,于是采用两次显示符号的方法,较理想
的解决了负号问题。

3
4、源程序清单和执行结果:
源程序:
DATA SEGMENT
XX DB 05H,0FCH,00H,03H,64H,0CDH
Y1 DB 'Y=1',0DH,0AH,'$'
Y2 DB 'Y=0',0DH,0AH,'$'
Y3 DB 'Y=-1',0DH,0AH,'$'
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START: MOV AX,DATA MOV DS,AX
LEA SI,XX
MOV AX,0
MOV CX,6
L1: MOV AL,[SI]
CMP AL,0 ;与0比较
JG BIGER
JE EQUAL
MOV DX,OFFSET Y3
MOV AH,09H
INT 21H
JMP OUTPUT
BIGER: MOV DX,OFFSET Y1 MOV AH,09H
INT 21H
JMP OUTPUT
EQUAL: MOV DX,OFFSET Y2 MOV AH,09H
INT 21H
OUTPUT:INC SI
LOOP L1
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果:
思考题:
程序中的原始数据是以怎样的形式存放在数据区中的?请用DEBUG调试程序观察并分析。

以补码形式存放
实验七循环程序设计
实验内容:
1. 编制程序计算S=1+2?3+3?4+4?5+??+N(N+1)+??直到N(N+1)大于200为止,并将结果由屏幕上显示出来。

其程序的流程图如图7. 1所示。

2. 将从3000H内存单元开始的100个字节存储单元全部清0。

本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。

源程序:
(1)编制程序计算S=1+2?3+3?4+4?5+??+N(N+1)+??直到N(N+1)大于200为止,并将结果由屏幕上显示出来。

DATA SEGMENT
RESULT DW ?
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV DX,1
LP: MOV AL,BL
ADD BL,1
MUL BL
ADD DX,AX ;DX中存放sum和
CMP AX,200
JG OUTPUT
LOOP LP
OUTPUT: MOV BX,DX
MOV CX,4
LP2: ROL BX,1 ;BL存放和,移位,从高到低一位一位显示ROL BX,1 ROL BX,1
ROL BX,1
MOV AX,BX
AND AX,000FH ;取BL中低四位
XOR DX,DX
ADD AL,30H ;十六进制转换成ASCII码加30H
CMP AL,3AH ;0—9数字与A—F的ASCII码不连续
JB PIT
ADD AL,07H ;若比A(10)大,还要再加07H
PIT: MOV DL,AL
MOV AH,02H
INT 21H
LOOP LP2
INT 21H
CODE ENDS
END START
运行结果:
(2)将从3000H内存单元开始的100个字节存储单元全部清0。

本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。

DATA SEGMENT
ORG 3000H
X DB 100 DUP(?)
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
LEA SI,X
MOV CX,100
LP: AND BYTE PTR[SI],00H
INC SI
LOOP LP
MOV AH,4CH
CODE ENDS
END START
运行结果:
先将内存单元赋值,用debug的E指令赋值,用D指令查看内存中的数据
再运行程序,将内存单元全部清零
实验八子程序设计
1、程序说明:编制一程序,要求键入一个班的学生成绩,并存放于50字的ERADE数组中,然后根据ERADE中的成绩,把学生名次填入50字的RANK数组中,再按学号顺序把名次从终端上显示出来。

提示:
① 程序MAIN
功能:根据输入的学生成绩,计算并显示出学生名次。

② 子程序INPUT
功能:接收一个班级学生的成绩,各成绩之间用空格隔开。

③ 子程序RANKP
功能:计算一个班级学生的名次。

④ 子程序OUTPUT
功能:输出(显示)一个班级的学生名次
⑤ 子程序DECIBIN
功能:十进制转换二进制,存入BX
⑥ 子程序BINDEC
功能:十进制转换二进制,并在屏幕上显示。

⑦ 子程序DEC_DIV
功能:BX的内容除以CX的内容,并在屏幕上显示一位商。

DATA SEGMENT
GRADE DW 50 DUP( )
RANK DW 50 DUP( )
ENTER DB 'Grades:',24H ;提示用户输入成绩
ERROR DB 13,10,'Error!',13,10,24H ;用户输入的格式出错SHOW DB 'Rank: ',24H
COUNT DW 0 ;统计输入的成绩个数
CR DB 13,10,24h ;换行
DATA ENDS
STACK SEGMENT STACK
DB 400 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
CALL INPUT
CALL RANKP
CALL OUTPUT
MOV AH,01H
INT 21H
INT 21H
;INPUT程序段
;以学号为序从键盘输入一个班的学生成绩,各个成绩之间用逗号格开,最后以回车符结束。

;然后把一个班的成绩存入grade数组。

INPUT PROC NEAR
LEA DX,ENTER
MOV AH,9
INT 21H ;提示用户输入
MOV SI,0
MOV COUNT,0 ;将输入用户的输入个数置0
_ENTER: ;对用户的输入进行监视,对错误输入立即进行出错处理CALL DECIBIN ;调用DECIBIN ;对用户输入进行处理
INCCOUNT
CMP DL,',' ;与','比较,相同则保存成绩,不同出错JE _STORE
CMP DL,0DH ;与回车键进行比较,回车则成绩输入结束JE _ENDENTER
JNE _ERROR ;出错处理:显示出错信息
_STORE:;保存成绩
MOV GRADE[SI],BX
ADD SI,2
JMP _ENTER
_ERROR:
LEA DX,ERROR
MOV AH,9
INT 21H
_ENDENTER: ;用户结束成绩输入
MOV GRADE[SI],BX
MOV DX,OFFSET CR ;换行
MOV AH,9
INT 21H
RET
INPUT ENDP
;RANKP程序段
;从grade数组取得一个班的成绩,以学号为序计算出该班每个学生的名次存入rank数组。

;算法为:一个学生的名次等于成绩高于该生的学生人数加1
RANKP PROC NEAR
MOV DI,COUNT
MOV BX,0
_LOOP:
MOV AX,GRADE[BX] ;取学生成绩
MOV WORD PTR RANK[BX],0 ;初始化RANK[BX]的值为0 MOV CX,COUNT
LEA SI,GRADE ;第一个学生的成绩 _NEXT1:
CMP AX,[SI] ;比较两个成绩
JG _JUMP ;成绩大于被比较的跳过 INCWORD PTR RANK[BX]
_JUMP:
ADD SI,2 ;取下一个被比较成绩的地址 LOOP _NEXT1
ADD BX,2 ; 下一个成绩
DEC DI ;未比较成绩个数减1 JNE_LOOP
RET
RANKP ENDP
;OUTPUT程序段
;从rank数组取得一个班的学生名次。

把一个班的学生名次以学号为序在终端显示出来 ;调用子模块binidec,以便把rank数组中的二进制数转成十进制数并在终端上显示出来.调用子模块crlf完成回车,换行功能.
OUTPUT PROC NEAR
LEA DX,SHOW
MOV AH,09H
INT21H
MOV SI,0
MOV DI,COUNT
_NEXT2:
MOV BX,RANK[SI] ;将成绩保存到BX中 CALL BINIDEC ;调用BINIDEC
CMP DI,1 ;将剩余的成绩个数与1比较,若为1则不显示',' JE _NOCOMMA
MOV DL,','
MOV AH,02H
INT21H ;显示','
_NOCOMMA:
ADD SI,02H;取下一个成绩名次 DEC DI
JNZ _NEXT2
MOV DX,OFFSET CR ;换行
MOV AH,9
INT 21H
RET
OUTPUT ENDP
;DECIBIN程序段
;从键盘取得一个十进制数。

把该数转换成二进制数并存入BX寄存器中。

DECIBIN PROC NEAR
MOV BX,0
_CATCH:
MOV AH,01H
INT21H
MOV DL,AL
SUB AL,30H
JL _ENDCHANGE ;小于则结束SFVOF=1 CMP AL,39H
JG _ENDCHANGE ;大于则结束
CBW
XCHG AX,BX;AX与BX值交换 MOV CX,10
MUL CX;无符号数乘法指令,(AX)<----(AL)*(CX)
XCHG AX,BX
ADD BX,AX ;(BX)<------(BX)+(AX) JMP _CATCH
_ENDCHANGE:
RET
DECIBIN ENDP
;BINIDEC程序段
;把bx寄存器中的二进制数转换成10进制数,并在终端屏幕上显示出来。

调用dec_div来作除法运算并显示字符。

BINIDEC PROC NEAR
PUSH BX
PUSH CX
PUSH SI
PUSH DI ;压栈
MOV CX,10
CALL DEC_DIV ;调用DEC_DIV
MOV CX,1
CALL DEC_DIV ;调用DEC_DIV
POP DI
POP SI
POP CX
POP BX ;出栈
RET
BINIDEC ENDP
;DEC_DIV程序段
;把bx中二进制数除以相应的十的幂,并在屏幕上显示一位商。

余数保存在bx 寄存器中。

DEC_DIV PROC NEAR
MOV AX,BX
MOV DX,0
DIVCX
MOV BX,DX
MOV DL,AL
ADD DL,30H
MOV AH,02H
INT 21H;显示
RET
DEC_DIV ENDP
CODE ENDS
END START
运行结果:
1、思考题:
(1)写出4位BCD码转二进制数的算法。

设AX寄存器中存放着4位BCD码
BCDTO2 PROC NEAR
PUSH BX
PUSH CX
PUSH DX
MOV BX, AX;保存AX中的BCD码到BX
MOV AX, 0 ;结果单元清0
MOV CX, 4 ;共处理4位BCD码
RETRY: PUSH CX
MOV CL, 4
ROL BX, CL ;最高1位BCD码移到BX中的低半字节 POP CX MUL W10 ;累加和AX x 10 -> DX:AX PUSH BX
AND BX, 000FH ;取出BX中的1位BCD码
ADD AX, BX ;累加到AX中
POP BX
LOOP RETRY
POP DX
POP CX
POP BX
RET
BCDTO2 ENDP
(2) 写出AX中进二制数转BCD码的算法。

W1000 DW 1000,100,10,1 ;十进制数千,百,十,个位权值 ;入口参数:AX=二进制数。

出口参数:AX=压缩BCD码
AX2TOBCD PROC NEAR
XOR BX, BX ;BCD码暂存单元清0
MOV SI, OFFSET W1000 ;权值首地址送SI
MOV CX, 4 ;循环次数4 -> CX
RETRY: PUSH CX
MOV CL, 4
SHL BX, CL
MOV DX, 0 ;DX:AX组成被除数
DIV WORD PTR[SI] ;除以权值,商,余数在AX,DX中
OR BX, AX ;压缩BCD码
MOV AX, DX ;余数送AX
POP CX
ADD SI, 2 ;地址加2,指向下一权值
LOOP RETRY
MOV AX, BX ;BCD码由BX -> AX RET
AX2TOBCD ENDP
实验九综合程序设计
设有十个学生成绩分别是76,69,84,90,73,88,99,63,100和80分。

试编制一个子程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。

源程序:
DATA SEGMENT
S1 DB 'below 60:','$'
S2 DB '60~69: ','$'
S3 DB '70~79: ','$'
S4 DB '80~89: ','$'
S5 DB '90~99: ','$'
S6 DB '100:','$'
XX DB 76,69,84,90,73,88,99,63,100,80
COUNT EQU $-XX
NUMBER DB 6 DUP(0) ;存放每个数据段的人数
ENTER DB 0DH,0AH,'$' ;回车换行
DATA ENDS
STACK SEGMENT STACK
DB 10 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX, DATA
MOV DS,AX
CALL GRADE
CALL SHOW
MOV AH,4CH
INT 21H
;统计各分数段人数的子程序GRADE PROC NEAR
MOV CX,COUNT
LEA SI,XX
LEA DI,NUMBER
LP: MOV BL,[SI]
CMP BL,60
JL BELOWSIX
CMP BL,70
JL SIX
CMP BL,80
JL SEVEN
CMP BL,90
JL EIGHT
CMP BL,100
JL NINE
INC BYTE PTR[DI+5] NEXT: INC SI
XOR BX,BX
LOOP LP
JMP ENDGRADE
BELOWSIX: INC BYTE PTR[DI] JMP NEXT
SIX:INC BYTE PTR[DI+1] JMP NEXT
SEVEN: INC BYTE PTR[DI+2] JMP NEXT
EIGHT: INC BYTE PTR[DI+3] JMP NEXT
NINE : INC BYTE PTR[DI+4] JMP NEXT
ENDGRADE: RET
GRADE ENDP
;将结果显示到屏幕上的子程序SHOW PROC NEAR
XOR SI,SI
MOV SI,OFFSET NUMBER
LEA DX,S1
MOV AH,09H
INT 21H
XOR DX,DX
MOV DL,[SI]
ADD DL,30H
MOV AH,02H INT 21H
LEA DX,ENTER MOV AH,09H INT 21H
LEA DX,S2 MOV AH,09H INT 21H
XOR DX,DX MOV DL,[SI+1] ADD DL,30H MOV AH,02H INT 21H
LEA DX,ENTER MOV AH,09H INT 21H
LEA DX,S3 MOV AH,09H INT 21H
XOR DX,DX MOV DL,[SI+2] ADD DL,30H MOV AH,02H INT 21H
LEA DX,ENTER MOV AH,09H INT 21H
LEA DX,S4 MOV AH,09H INT 21H
XOR DX,DX MOV DL,[SI+3] ADD DL,30H MOV AH,02H INT 21H
LEA DX,ENTER MOV AH,09H INT 21H
LEA DX,S5 MOV AH,09H INT 21H
XOR DX,DX MOV DL,[SI+4] ADD DL,30H MOV AH,02H INT 21H
LEA DX,ENTER MOV AH,09H
INT 21H
LEA DX,S6
MOV AH,09H
INT 21H
XOR DX,DX
MOV DL,[SI+5]
ADD DL,30H
MOV AH,02H
INT 21H
RET
SHOW ENDP
CODE ENDS
END START
运行结果:
实验心得体会:
本次试验加强了我的实践操作能力,原本看似浅显简单的理论知识,一搬到实践运用上就显得不那么简单了,往往容易犯低级错误,最终在老师和同学的帮助下完成了本次为时几周的微机实验。

我觉得这样的实验很有必要,它不仅加强了实践能力,更进一步帮助自己理解了平时上课可能理解不了的知识点,丰富了课堂教学内容,提高了我对微机系统,汇编语言的兴趣,真是让我受益匪浅。

参考文献:
(1)微机原理实验指导书,东华大学信息信息科学与技术学院,201X年10月;
(2)80X86/Pentium微型计算机原理及应用(第3版),电子工业出版社。

∙荐计算机上机实验内容及实验报告要求
∙荐构建学校德育管理与评价体系的实验报告
∙荐化学实验报告格式
∙荐大学物理实验课程设计实验报告∙荐电路实验报告要求。

相关文档
最新文档