1、微机实验答案 实验三 统计学生成绩 设有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
2、 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 scor
3、e[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 ste
4、p5: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为首地址的字节数组中查
5、找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 seg
6、ment 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
7、 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 a
8、h,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
9、此处为何减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 [s
10、i],'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
11、 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
12、 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
13、模块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 MO
14、V 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的值,用于
15、以后循环亮灯 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
16、 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
17、 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 ; 设置方式字
18、 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”
19、 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
20、 OUT 20H,AL ; 中断结束命令 POP DX POP AX STI IRET INTP ENDP CODE ENDS END START 【参考实验流程图】 三、实验代码 1、完成指导手册要求 实验十二8位A/D转换实验(中断方式) 实验内容 从ADC0809通道0输入+5V可变电压,使用中断方式采集数据,并将转换数据在7段数码管上以16进制数显示。 实
21、验代码如下: .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
22、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
23、 ;启动转化 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,A
24、L ;将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] ;设置低位要显示的数
25、字 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,000
26、01111H ;屏蔽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
27、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方式一次
28、传送,并在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 A
29、SSUME 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
30、 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 ;写高位地址到基地址寄存器
31、 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






