微机原理上机实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说明:
1. 将本文档改名为‚学号_姓名_班级_微机原理上机.doc‛,并按以下说明完成本次上机内容;
2. 请各班课代表将本班上机作业收齐并压缩为‚微机原理_上机_班级.rar‛;
3. 请课代表在第10周末(201
4.
5.4)前将本班上机作业发送到ustblili@12
中,邮件
标题为‚微机原理_上机_班级‛。
汇编
语言开发工具使用简介
① 打开‚轻松汇编‛应用程序,工作界面如下图所示:
② 点击工具栏中的图标,将系统自动生成的汇编语言源程序文件更名并保存在合适的路径下;
③ 在编辑区输入你编写的程序,并保存;
④ 点击工具栏中的图标,进行编译。
如果源程序有误,在下方输出窗口提示错误信息,需要修改后再进行编译;如果无误,输出窗口提示‚编译成功‛;
⑤ 点击工具栏中的图标,进行链接。
如果无误,输出窗口提示‚链接成功‛;
⑥ 点击工具栏中的图标,运行程序;如有结果输出,即可在命令窗口中看到输出结果。
⑦ 如需调试程序,可设置断点后,点击工具栏中的图标,在界面左侧看到各寄存器的内容,如下图所示。
实验内容和实验要求 1.
DOS 功能调用
(1) 键盘输入屏幕显示
编写程序,实现键盘输入屏幕显示实验。
即:当程序运行时,每从键盘输入一个字符,就在屏幕上显示一个字符,直到输入‚$‛字符,则退出程序。
程序源码:(请填入程序中缺失的部分)
运行结果截图:
(2) 输入小写字母输出大写字母
编写程序,实现小写输入大写输出功能。
即:由键盘输入一个小写字母,在屏幕上显示一个与之对应的大写字母。
注意非小写字母输入的问题。
程序源码:(请填入程序中缺失的部分)
CODE S EGMENT
ASSUMECS:CODE S
TART: MOV AH, 1
INT
21H
C MP A L,‛$‛ JNZ S TART MOVAH,4CH INT
21H
CODE
ENDS END
S TART
运行结果截图:
CODE S EGMENT ASSUME
CS:CODE
S TART:
;代码段
;****编写代码实现小写字母输入,大写字母输出功能**** M OV AH,1INT 21H
CMPA L,’a’ J B STOP CMPA L,‘z’ J A STOP S U B A L ,20H M OV DL,AL M OV AH,2INT 21H
;*******************自行编写代码结束*************** STOP:
MOVAX,4C00H INT 21H
CODE
ENDS
END S TART
;退出程序
(3) 凯撒密码
设计程序,输入一个字符串,按明文右移三位的移位加密方式,实现对字符串的凯撒加密,并将结果输出到屏幕上。
如:’h e llo ’加密后为’k h oor ’
程序源码:
SI,III ;键入字符的起始地址. DI, K_S
;加密字符的起始地址.
LEA LEA DO_IT: ;收到字符的个数.
CL,NNN CH,0 CX,0 DO_IT EXIT
MOV MOV CMP JNZ
JMP ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐ MOV MOV INT MOV MOV INT
AX,DATA DS,AX
MOV MOV START: CS: CODE, DS:DATA ASSUME DATA ENDS
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐CODE SEGMENT
;用于提示. ;用于提示. 13,10,'Input STR :$ ' 13,10,'OutputSTR:$
' M ES_I DB MES_O
DB ;100字节的空间. 10 0 DUP('$') K_S
DB 100 ;准备接收100个字符. ?
;用于存放实际输入的个数. 1 00 DUP(?)
;100字节的空间.
PARS DB NNN
DB DATA SEGMENT DX, OFFSET MES_I AH,9 21H
;9号功能调用,显示提示.
DX, OFFSETPARS AH,10 21H
;10号功能调用,接收键盘输入.
MOV CMP JC
AL, [SI] AL,'A'NEXT
AL,'{' NEXT
;‐'{'
;大于'z'不用处理,转移到下一个
DX, OFFSET MES_O AH,9 21H
;9号功能调用,显示提示.
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐加密结束 MOV MOV INT
;保存密码
[ DI],AL SI DI AGAIN MOV INCI NC
LOOP NEXT: AL,26 J_26: SUB ;大于'Z',超过了最后的字母,应减去26
AL,3 AL,'[' J_26N EXT ADD CMP JNC
JMP ;‐'['
;大于'Z'不用处理,转移到下一个
AL,'[' NEXT CMP JNC BIG: ;大于'z',超过了最后的字母,应减去26
J_26 NEXT JNC JMP ;加密
AL,3 AL,'{' ADD CMP SMAL: ;小于'a'可能是大写,转移
AL, 'a' BIG
CMP JC ;小于'A'不用处理,转移到下一个 CMP JNC
;取来一个 ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐下面开始循环统计. AGAIN:
运行结果截图:MOV
MOV
INT
DX, OFFSET K_S
AH,9
21H
;9号功能调用,显示密码.
;‐
‐‐‐
‐‐‐
‐‐‐
‐‐‐
‐‐‐
‐‐‐
‐‐‐
‐‐‐
‐‐‐
‐‐‐
‐‐‐
‐‐‐
‐‐‐
‐‐显示结束.
EXIT:
MOV INT
AH, 4CH 21H
CODE ENDS
END START
2. 传送类程序设计(4)
字符串传送
将数据段中的一个字符串传送到附加段中,然后将附加段中的字符串输出到屏幕上。
程序源码:(请填入程序中缺失的部分)
INT 21H
KEY: MOV AH, 01H ;判断是否有按键按下?
INT 16H;为观察运行结果,使程序有控制的退出
JZ KEY
MOV A X, 4C00H ;结束程序退出
INT 21H
CODE ENDS
END S TART
注:‚INT16H‛为BIOS功能调用提供的键盘服务,AH中存放功能号,01H功能号的作用是读取键盘状态,说明如下:
01H功能描述:读取键盘状态入口
参数:AH=01H
出口参数:ZF=1—无字符输入;否则,AH=键盘的扫描码,AL=ASCII码运行结果截
图:
思考:可以使用串操作指令完成以上功能吗?请将源程序填入到下框中。
DATAS SEGMENT ;定义源数据段MSR DB "HELLO,WORLD!$"
LEN EQU $ ‐M SR
DATAS ENDS
EXDA MSD SEGMENT
DB LEN DUP(?)
;定义附加数据段
EXDA ENDS
STACK1 SEGMENT
DW STACK
20 DUP(?)
;定义堆栈段
STACK1 ENDS
CODE SEGMENT ;定义代码段
ASSUME CS: CODE, DS: DATAS, ES:EXDA
START: MOV AX, DATAS
MOV DS, AX ;装载数据段寄存器
MOV AX, EXDA
MOV ES, AX ;装载附加数据段寄存器
MOV SI, OFFSET MSR ; 设置SI
MOV DI, OFFSET MSD ; 设置DI
MOV CX, LEN
NEXT: ;开始传输数据
MOVSB
DEC CX
JNZ NEXT
PUSH ES
POP DS ;将附加段寄存器指向的段值赋给DS寄存器 MOV
DX, OFFSET MSD
MOV AH, 9
INT 21H
KEY: MOV AH, 01H ;判断是否有按键按下?
INT 16H ;为观察运行结果,使程序有控制的退出JZ
KEY
MOV AX, 4C00H ;结束程序退出
INT 21H
CODE ENDS
END START
DATAS
S EGMENT
;数据段
X Y Z QUOT R EMA
ENDS DW DW DW DW DW
4 5 20 ? ?
DATAS CODE
S EGMENT
ASSUME
;代码段
CS:CODE,
S TART:
MOV A X, DATAS MOV
DS,
AX
DS:DATAS ;初始化
;****编写代码实现多项式(X-18+X*Y )/Z 的计算功能****
MOV IM UL S UB ADD IDIV
A X,X Y AX,12H A X,X Z
;*******************自行编写代码结束****************
(5) 思考题
设变量 X 定义如下:X
DW
20
DUP(?)
分析下列MOV 指令分别执行后,对应寄存器中的内容是什么? ①
MOV A X, TY PEX
②
MOV CX, L ENGTHX
③
MOV DX, S IZEX
3.
运算类程序设计(6)
多项式运算
编写程序代码,实现对多项式(X ‐18+X*Y)/Z 的计算,并把计算所得商和余数分别存入变量QUOT 和REMA 中。
要求:X 、Y 、Z 和QUOT 、REMA 均是有符号的字变量。
程序源
码:(请填入程序中缺失的部分)
答:0028H
答:0014H
答:0002H
运行结果截图:(提示:在MOVAX,4C00H 语句处设置断点,通过调试查看AX 和DX 寄存器中的内容)
4. 数码转换程序设计(7)
十进制‐二进制转换
将缓冲区中的一个5位十进制数00012的ASCII 码转换成二进制数,并将转换结果按位显示在屏幕上。
程序源码:(①填入程序中缺失的部分; ②在指定语句后添加注释,说明该语句的作用)
MOV MOV MOV INT
C ODEENDS
QUOT, AX REMA,
DX
AX,4C00H 21H
;退出程序
END S TART
STACK1 SEGMENT STACK
DW 256 DU P(?)
STACK1ENDS DATA
S EGMENT
M ES1 DB 'The ascii code of decim a l code a re:$'
B UF DB 30H,30H,30H,31H,32H
DB 10HDUP(0)
DATA ENDS
CODE S EGMENT
ASSUME CS:CODE,DS:DATA S
TART: MOV A X ,DATA
MOV DS , AX
MOV SI, OFFSET BUF
MOV B X, 000AH
MOV C X, 0004H
MOV AH, 00H
MOV AL,[SI] ;取第一位ASCII 码
SUB A L,30H
A 1: M UL BX ;将其乘以10
MOV DH,00H
MOV DL,[SI+1];取下一位ASCII 码 S UB
DL,30H
ADD A
X,DX INC SI
LOOP A1
MOV [SI], AX ; 把计算得到的12 的十六进制000 C 放到 SI MOV DX,OFFSETMES1
MOV AH, 09H
INT 21H
INC SI
C ALL SHOW
DEC SI ;显示低字节
C ALL SHOW
WAIT1: MOV AH, 1 ;判断是否有按键按下
INT 16H
JZ WAIT1 ;无按键则跳回继续等待,有则退出
MOV AX,4C00H
INT 21H SHOW PROC NEAR
C2: MOV
AND
SHR
C MP
JB
ADD
ADD
MOV
MOV
AL,DS:[SI]
AL,0F0H
A L ,4
AL,0AH
C2
A L, 07H
A L, 30H
DL, AL
A H, 02H
;数据显示程序段
;把SI表示的一位字节放入AL
; 取高 4位
;AL逻辑右移4位即把左四位变为0000
; 是否是 A 以上的数
; 如果 A L 小于10 ,转 C 2
;否则AL大于等于10,+7变成字母
;转化为对应字符的ascii码
; showcharacter
INT 21H
MOV
AND
C MP
AL,DS:[SI]
A L, 0FH
AL,0AH
;把SI表示的一位字节放入AL
; 取低 4位
JB C3
ADD A L, 07H
; 如果 A L 小于10 ,转 C3
;否则AL大于等于10,+7变成字母
C3: ADD
MOV
MOV A L, 30H
DL, AL
A H, 02H
; showcharacter
INT 21H
RET
ENDP
C ODEENDS
END S TART
运行结果截图:(提示:在MOVAX,4C00H语句处设置断点,通过调试查看AX和DX寄存器中的内容)
5. 分支程序设计(8)
分数统计
统计一个班30个学生分布在不同分数段的人数。
说明:定义一个变量GRADE,其中存放有30个学生某门课的考试成绩,要求编写一段程序,分布统计该门课各分数段中的人数,分数段的划分为:90~100分、80~90分、70~79 分、60~69分和60分以下。
程序源码:(请填入程序中缺失的部分)
JAENEXT1 INC J MP
NEXT1:CMP CL REPT1
A L, 90
;统计60 分以下人数
JB NEX T2 INC BH J MP
REPT1
NEXT2:
C MP A L,80 JB NEX T3 INC BL
J MP
REPT1 NEXT3:CMP A L, 70
JB NEX T4 ;统计90~100 分人数
;统计80~89 分人数
INCDH J MP
REPT1
NEXT4: INC DL ;统计70~79 分人数
;统计60~69 分人数
REPT1:
INC
DECJ NZ MOV SI
CH A GAIN AH,4CH INT
21H
C ODEENDS
END S TART
MOV C H,30 ;学生总人数
MOV
SI,
OFFSET
GRADE
A GA IN: MOV
AL,[SI]
C MP A L,60
运行结果截图:(提示:在MOVAH,4CH 语句处设置断点,通过调试查看各个寄存器中的内容)
6. 循环程序设计(9)
寻找最大值
在指定区域NUM中存放30个无符号数,编写程序,寻找其中的最大数。
程序源码:(请填入程序中缺失的部分)
DATA S EGMENT
NU
M
DB
DB
DB 100,23,22,87,141,72,222,156,251,21
80,54,68,37,85,28,47,38,52,29
111,151,46,36,92,59,103,91,81,41
?
; 定义30 个数据
CODE S EGMENT
ASSUME CS:CODE, DS:DATA
S TART: MOV
MOV
MOV
MOV
A X, DATA
DS, AX
AL, NUM ;将第一个数据送入AL C X ,29;循环次数送入CX
M OV B X , OFFS ET NUM ;将BX作为数据块的指针LOOP1: I NC BX
CMPAL,[BX] J
AENEXTM O V
AL, [BX]
NEXT: LOOP
MOV
MOV LOOP1
MAX, AL
AH, 4CH
;指针加1,[BX]指向下一数据
;A[i]与A[i+1]比较
;若A[i]大于等于A[i+1],转向NEXT
;若A[i]小于A[i+1],则数据交换
;CX自减1,若不等于0,则转向LOOP1
;将最大值送入MAX
INT 21H
CODE ENDS
END S TART
运行结果截图:(提示:在MOVAH,4CH语句处设置断点,通过调试查看AL寄存器中的内容)
DATAS
S EGMENT GRADE
DB DB S UM DW BJGL DB
PJCJ
DBDAT
;数据段
30,86,77,58,60,100,0,76,88,92,70,63,69,51,48,97 59,72,76,80,66,61,20,90,74,85,87,75,65,10 0
? ?
CODE S EGMENT
;代码段 ASSUME
CS:CODE,
DS:DATAS S TART:
MOV
A X , DATAS
;初始化
(10) 思考题
编程实现分数统计:参考第(8)题的实验程序,实现统计全部30个同学某一门考试成绩(满分100分)中高于90分和低于60分的人数。
并计算全部的不及格率以及平均成绩。
要求:随机输入30个0到100的整数,并计算结果。
程序源码:
MOV MOV MOV MOV DS , AX
B L,0
B H,0
C H,30
;60 分以下人数统计单元清零
;90~100 分人数统计单元清零
;学生总人数
MOV SI, OFFSET GRADE
A GAIN: MOV AH,0
MOV AL,[SI]
ADD SUM,AX
C MP A L,60
JAE NEXT1
INC BL ;统计60 分以下人数
JMP REPT1
NEXT1: C MP A L, 90
JB REPT1
INC BH ;统计90~100 分人数
JMP REPT1
REPT1: INC SI
DEC CH
JNZ A GAIN
MOV CH,30
MOV A L,BL
MOV CL,100
M UL CL
DIV CH
MOV C L,AL
MOV AX,SUM
DIV CH
C MP AH,15 ;四舍五入
JB FUN1
INC CL
JMP FUN1
FUN1: MOV B JGL,CL ;cl放置及格率
MOV PJCJ,AL ;al放置平均成绩
MOV AH,4CH
INT 21H
CODE ENDS
END S TART
运行结果截图:
高于90 分的BH=4
低于 6 0 分的BL=8
不及格率CL=1AH=26%
平均成绩AL=42H=66
7. 子程序设计
(11)思考题
编写程序计算某数据区中无符号数据最大值和最小值的差,结果送入RESULT字单元。
要求:最大值和最小值分别用子程序计算
程序源码:
DATAS S EGMENT ;数据段
NUM DW 36,26,7,85,14,70,49,77,88,42 RESULT DW ?
DATAS ENDS
CODE S EGMENT ;代码段
ASSUME CS:CODE, DS:DATAS S TART: MOV A X,DATAS ;初始化
MOV DS , AX
MOV S I,OFFS ET NUM
CALL M AX
MOV S I,OFFS ET NUM
CALL MIN
S UB AX,BX
MOV RESULT,AX
MOV AH,4CH
INT 21H
M AX PROC NEA
R MOV AX,[SI]
MOV
CX,9LOOP1: INC
SI
INC SI
C MP AX,[SI]
JAE LOOP2
XCHG AX,[SI]
LOOP2: DEC CX
JNZ LOOP1
RET
M AX ENDP
MIN PROC NEAR
MOV BX,[SI]
MOV CX,9
LOOP3: INC SI
INC SI
C MP BX,[SI]
JB LOOP4
XCHG BX,[SI]
LOOP4: DEC CX
运行结果截图:
(12) 选做题
设计一个万年历程序。
已知2008年1月1日为星期二,求2008年之后21世纪的某年某月某日是星期几?(要求年、月、日在运行时输入)
程序源码:
JNZ
RET
MIN ENDP LOOP3
CODE ENDS
END S TART
运行结果截图:。