资源描述
微机实验答案
实验三 统计学生成绩
设有20个学生成绩分别56、78、67、40、87、99、63、51、74、100,90,80,68、88、55、66、84、96、45、73分。编写程序实现统计低于60分、60-69分、70-79分、80-89分、90-99分及100分的人数,并分别存放在s5、s6、s7、s8、s9、s10单元中。
实验代码如下:
data segment
score db 56,78,67,40,87,99,63,
51,74,100,90,80,68,88,55,66,84,
96,45,73
s5 db 0
s6 db 0
s7 db 0
s8 db 0
s9 db 0
s10 db 0
data ends
code segment
assume cs: code, ds: data
start: mov ax,data
mov ds,ax
mov si,0
mov cx,20
lop1: cmp score[si],60
jb step1
cmp score[si],70
jb step2
cmp score[si],80
jb step3
cmp score[si],90
jb step4
cmp score[si],100
jb step5
inc [s10]
jmp exit
step1:inc [s5]
jmp exit
step2:inc [s6]
jmp exit
step3:inc [s7]
jmp exit
step4:inc [s8]
jmp exit
step5:inc [s9]
exit: inc si
loop lop1
mov al,s6 ; 显示s6,可用s5,s7,
s8等替换(实验要求之思考题三)
add al,48
mov dl,al
mov ah,02
int 21h
mov ah,4ch
int 21h
实验四 查找字符
实验内容
试编写一个有主程序和子程序结构的程序模块。
主程序:要求从键盘接收一串字符并存于字节数组TABLE中,显示字符CHAR出现的次数。
子程序:在以TABLE为首地址的字节数组中查找CHAR,统计出现的次数。
实验代码如下:
data segment
table db 100 dup('$')
str1 db 'please enter a string
which is less than 100 and en
d with enter button:$'
str2 db 'times that char appear is:$'
n dw ?
data ends
stack segment stack 'stack'
db 100 dup('$')
stack ends
code segment
assume cs: code, ds: data
start: mov ax,data
mov ds,ax
lea dx,str1
mov ah,9
int 21h ;输出 str1
call func1 ;回车,换行
mov si,0
mov cx,100
lop1: mov ah,1
int 21h
cmp al,0dh
jz exit
mov table[si],al
inc si
loop lop1 ;从键盘输入
exit: mov n,si
call func2 ;计算 'char' 出现的次数
call func1 ;回车,换行
lea dx,str2
mov ah,9
int 21h ;输出 str2
call func1 ;回车,换行
mov al,bl
add al,30h
mov dl,al
mov ah,2
int 21h ;输出 'bx'
mov ah,4ch
int 21h
func1 proc near
push dx
push ax
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
pop ax
pop dx
ret
func1 endp ;输出回车,换行
func2 proc near
push si
push cx
push ax
mov cx,si
mov ax,si
sub ax,3 ;此处为何减3,下面会有解释
lea si,table
mov bx,0
lop2: cmp byte ptr [si],'c'
jnz exit1 ;判断完c后加1再循环,而h,a,r则不然
inc si
cmp byte ptr [si],'h'
jnz exit2
inc si
cmp byte ptr [si],'a'
jnz exit2
inc si
cmp byte ptr [si],'r'
jnz exit2
inc bx
exit1: inc si
exit2: cmp si,ax
loopnz lop2
pop ax
pop cx
pop si
ret
func2 endp
code ends
end start
实验六 定时计数器实验
实验代码如下:
.model small
.386
code segment
assume cs: code
start: mov ax,data
mov ds,ax
mov dx,203h
mov al,00110110b
out dx,al
mov dx,200h
mov ax,0h ; 0h 减1后得到FFH,从而满足题目要求
out dx,al
mov al,ah
out dx,al ;
mov dx,203h
mov al,01110110b
out dx,al
mov dx,201h
mov ax,fh
out dx,al
mov al,ah
out dx,al
mov ah,4ch
int 21h
code ends
end start
实验七 中断控制器实验
实验相关知识简介:
实验内容
1、单中断,使用单脉冲电路产生脉冲信号作为8259中断请求输入,每按一次单脉冲按键,触发一次中断,使LED灯向左移一位,显示到最左端后再从最右端开始开始,循环显示。
2、单中断:使用单脉冲电路产生的脉冲信号作为386EX模块8259中断请求输入,每按一次单脉冲按键,触发一次中断,使7段数码管显示的“5”字左移一位,显示到最左端后再从最右端开始显示,如此重复。
实验1代码:
.Model Small
.386
CODE SEGMENT
ASSUME CS:CODE
START:
IN AL,21H
AND AL,0DFH ; 开通IR5中断通道
OUT 21H,AL
CLI
MOV AX,00H
MOV DS,AX
MOV SI,4*35H
MOV AX,OFFSET INTP
MOV [SI],AX ; 设置中断向量,将intp的偏移地址赋给[si]
ADD SI,2
MOV AX,SEG INTP
MOV [SI],AX ; si+2后将段地址赋给[si]
MOV DX,203H
MOV AL,10000011B ; 设置方式字
OUT DX,AL
MOV BL,1 ;设置bl的值,用于以后循环亮灯
STEP: STI
HLT ; 等待中断信号,接到中断信号后重复该步骤
JMP STEP
INTP PROC NEAR
CLI
PUSH AX
PUSH DX
MOV AL,BL
MOV DX,200H ; 输出LED亮灯信号
OUT DX,AL
ROL BL,1 ; 循环左移,控制亮灯信号
MOV AL,20H
OUT 20H,AL ; 中断结束命令
POP DX
POP AX
STI
IRET
INTP ENDP
CODE ENDS
END START
实验2代码:
.Model Small
.386
CODE SEGMENT
ASSUME CS:CODE
START:
IN AL,21H
AND AL,0DFH ; 开通IR5中断通道
OUT 21H,AL
CLI
MOV AX,00H
MOV DS,AX
MOV SI,4*35H
MOV AX,OFFSET INTP ; 设置中断向量,将INTP的偏移地址赋给[SI]
MOV [SI],AX ; SI+2后,将INTP的段地址赋给[SI]
ADD SI,2
MOV AX,SEG INTP
MOV [SI],AX
MOV DX,203H
MOV AL,10000011B ; 设置方式字
OUT DX,AL
MOV BL,1 ; 给bl赋值,用以控制各数码管的亮暗
STEP: STI
HLT ; 等待中断信号,接到中断信号后重复该步骤
JMP STEP
INTP PROC NEAR
PUSH AX
PUSH DX
CLI
MOV DX,200H
MOV AL,6DH ; 使数码管显示数字“5”
OUT DX,AL
MOV DX,201H
MOV AL,BL ; 使对应bl的数码管亮,其余暗
OUT DX,AL
ROL AL,1 ; 循环左移一位
CMP AL,01000000B
JNZ STEP1 ; 若循环到第七位,则赋值1,重新从最右端开始
MOV AL,1 ; 显示,并将al值赋给bl,避免丢失
STEP1: MOV BL,AL
MOV AL,20H
OUT 20H,AL ; 中断结束命令
POP DX
POP AX
STI
IRET
INTP ENDP
CODE ENDS
END START
【参考实验流程图】
三、实验代码
1、完成指导手册要求
实验十二8位A/D转换实验(中断方式)
实验内容
从ADC0809通道0输入+5V可变电压,使用中断方式采集数据,并将转换数据在7段数码管上以16进制数显示。
实验代码如下:
.Model small
.386
DATA SEGMENT
LED DB 3FH,06H,5BH,4FH,66H,6DH,
7DH,07H,7FH,67H,77H,7CH,39H,5EH,79H,71H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DX,AX
CLI
MOV AX,00H
MOV ES,AX
MOV DI,4*35H
MOV AX,OFFSET INTP
MOV [DI],AX
MOV AX,SEG INTP
MOV [DI+2],AX
STI
IN AL,21H
AND AL,11011111B ;开放MIR5通道
OUT 21H,AL
STEP: MOV DX,200H
MOV AL,0 ;启动转化
OUT DX,AL
MOV CX,0 ;用于选择显示高位还是低位
STI
HLT ;等待中断
JMP STEP
MOV AH,4CH
INT 21H
INTP PROC FAR
PUSH AX
PUSH DX
CLI
MOV DX,201H ;读数据
IN AL,DX
MOV BL,AL ;将AL数值储存在BL里
AND CX,1 ;取cx的最低位,若为0则显示低四位,为1则显示高四位
JNZ STEP2
AND AL,00001111B
MOV AH,0 ;屏蔽AL高4位,并将AX(数值上等于偏移量)赋给DI
MOV DI,AX
MOV DX,210H
MOV AL,LED[DI] ;设置低位要显示的数字
OUT DX,AL
MOV DX,211H
MOV AL,04H ;设置显示位置
OUT DX,AL
DEC CX ; 将CX减1,使CX最低位改变为1,故可使下次终端显示高4位
JMP EXIT
STEP2: MOV AL,BL
PUSH CX
MOV CL,4 ;将AL高4位移到低4位
ROL AL,CL
POP CX
AND AL,00001111H ;屏蔽AL高4位
MOV AH,0
MOV DI,AX
MOV DX,210H ;设置低位要显示的数字
MOV AL,LED[DI]
OUT DX,AL
MOV DX,211H
MOV AL,08H ;设置显示位置
OUT DX,AL
DEC CX ; 将CX减1,使CX最低位改变为0,故可使下次终端显示低4位
EXIT: MOV AL,65H ;IR5中断结束
OUT 20H,AL
POP DX
POP AX
STI
IRET
INTP ENDP
CODE ENDS
END START
实验十五DMA读操作实验
利用8237DMA的0通道实验MEMàI/O的传送。将2000H:0000H~2000H:0007H共8个数据01H,02H,04H,08H,10H,20H,40H,80H通过DMA方式一次传送,并在8个led中显示对应状态。DMA请求使用单脉冲长生,led与8255的PA口连接,DMA传送时,通过8255的传输端口控制led的亮与灭。
说明:8255的DMA_EN的作用是为了在DMA响应期间,使能8255,并禁止A1A0译码,使其A1A0=00,因此,DMA传送期间传送的数据会固定送往PA端口,此时的8255PA口当做8为锁存器使用。
实验代码如下:
.Model small
.386
DATA SEGMENT
LED DB 01H,02H,04H,08H,10H,20H,40H,80H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START : MOV AX,DATA
MOV DS,AX
MOV CX,8H ;设置往内存单元赋值次数
MOV AX,2000H
MOV ES,AX ;设置要存入数值的内存起始地址为2000H:0000H
MOV DI,0
LEA SI,LED ; 将变量起始地址赋给si
STEP:
MOV AL,[SI]
MOV ES:[DI],AL
INC DI ;传送8个数据到2000:0000H单元
INC SI
LOOP STEP
MOV AL,10000000B
MOV DX,213H ;设置8255 A端口1方式输出
OUT DX,AL
MOV AL,00000100B
MOV DX,208H ;禁止82C37A工作
OUT DX,AL
MOV DX,20CH
OUT DX,AL ;清先/后触发器
MOV AX,0 ;写入基地址
MOV DX,200H
OUT DX,AL ;写低位地址到基地址寄存器
OUT DX,AL ;写高位地址到基地址寄存器
MOV AX,7H ;将传输字节数存入字节数寄存器
MOV DX,201H
OUT DX,AL ;写低位字节数到字节数寄存器
MOV AL,AH
OUT DX,AL ;写高位字节数到字节数寄存器
MOV AL,01011000B
MOV DX, ; 设置工作方式
OUT DX,AL
MOV AL,00000000B
MOV DX,208H ;命令字
OUT DX,AL
STEP2:
MOV DX,208H
IN AL,DX ; 检测通道0是否传输结束,未结束则不断查询
AND AL,00000001B
JNZ STEP2
CODE ENDS
END START
展开阅读全文