微机原理程序
微机原理程序(共7页)
--本页仅作为文档封面,使用时请直接删除即可-- --内页可以根据需求调整合适字体及大小--
;**********************; ;* 数/模转换实验1 *; ;* 产生锯齿波 *;
;**********************; io0832a equ 290h code segment assume cs:code start: mov cl,0
mov dx,io0832a lll: mov al,cl out dx,al add cl,10 push dx
mov ah,06h ;判断是否有键按下 mov dl,0ffh int 21h pop dx
jz lll ;若无则转LLL mov ah,4ch ;返回 int 21h code ends end start
;**********************; ;* 数/模转换实验2 *; ;* 产生正弦波 *;
;**********************; data segment
io0832a equ 290h Sin db
80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh db
0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db
80h,66h,4eh,38h,25h,15h,09h,04h Db
00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据 data ends code segment
assume cs:code,ds:data start: mov ax,data mov ds,ax
ll: mov si,offset sin ;置正弦波数据的偏移地址为SI
mov bh,32 ;一组输出32个数据
lll: mov al,[si] ;将数据输出到D/A转换器
mov dx,io0832a out dx,al mov ah,06h mov dl,0ffh int 21h jne exit mov cx,1
delay: loop delay ;延时 inc si ;取下一个数据 dec bh
jnz lll ;若未取完32个数据则转lll jmp ll
exit: mov ah,4ch ;退出 int 21h code ends end start
;****************************; ;* AD转换器2--示波器 *; ;* 采集数据在屏幕是作图 *; ;****************************; io0809b equ 299h code segment
assume cs:code
start: mov ax,0012h ;设屏幕显示方式为VGA 640X480模示 int 10h start1:
mov ax,0600h
int 10h ;清屏
and cx,0 ;cx为横坐标
draw: mov dx,io0809b ;启动A/D转换器通道1 out dx,al
mov bx,200;500 ;延时 delay: dec bx jnz delay
in al,dx ;读入数据
2
mov ah,0
mov dx,368 ;dx为纵坐标 sub dx,ax
mov al,0ah ;设置颜色 mov ah,0ch ;画点 int 10h
cmp cx,639 ;一行是否满 jz start1 ;是则转start inc cx ;继续画点 push dx
mov ah,06h ;是否有键按下 mov dl,0ffh int 21h pop dx
je draw ;无,则继续画点 mov ax,0003 ;有恢复屏幕为字符方式 int 10h
mov ah,4ch ;返回 int 21h code ends end start
;************************; ;*8251串行通讯(自发自收)*; ;************************; data segment
io8253a equ 280h io8253b equ 283h io8251a equ 2b8h io8251b equ 2b9h
mes1 db 'you can play a key on the keybord!',0dh,0ah,24h mes2 dd mes1 data ends code segment
assume cs:code,ds:data start: mov ax,data mov ds,ax
mov dx,io8253b ;设置8253计数器0工作方式 mov al,16h out dx,al
mov dx,io8253a
mov al,52 ;给8253计数器0送初值
out dx,al
mov dx,io8251b ;初始化8251 xor al,al
mov cx,03 ;向8251控制端口送3个0
delay: call out1 loop delay
mov al,40h ;向8251控制端口送40H,使其复位 call out1
mov al,4eh ;设置为1个停止位,8个数据位,波特率因子为16 call out1
mov al,27h ;向8251送控制字允许其发送和接收 call out1
lds dx,mes2 ;显示提示信息 mov ah,09 int 21h
waiti: mov dx,io8251b in al,dx
test al,01 ;发送是否准备好 jz waiti
mov ah,01 ;是,从键盘上读一字符
int 21h
cmp al,27 ;若为ESC,结束 jz exit
mov dx,io8251a inc al
out dx,al ;发送 mov cx,40h
s51: loop s51 ;延时 next: mov dx,io8251b in al,dx
test al,02 ;检查接收是否准备好 jz next ;没有,等待 mov dx,io8251a
in al,dx ;准备好,接收 mov dl,al
mov ah,02 ;将接收到的字符显示在屏幕上 3
int 21h jmp waiti
exit: mov ah,4ch ;退出 int 21h
out1 proc near ;向外发送一字节的子程序
out dx,al push cx mov cx,40h
gg: loop gg ;延时 pop cx ret out1 endp code ends end start ;
;8259中断查询方式应用实验
;*****************************************************************
; 2008年03月为8259应用修改 ;*****************************************************************
I8259_1 EQU 2B0H ;8259的ICW1端口地址
I8259_2 EQU 2B1H ;8259的ICW2端口地址
I8259_3 EQU 2B1H ;8259的ICW3端口地址
I8259_4 EQU 2B1H ;8259的ICW4端口地址
O8259_1 EQU 2B1H ;8259的OCW1端口地址
O8259_2 EQU 2B0H ;8259的OCW2端口地址
O8259_3 EQU 2B0H ;8259的OCW3端口地址
data segment
mes1 db 'you can play a key on the keyboard!',0dh,0ah,24h mes2 dd mes1
mess1 db 'Hello! This is interrupt * 0 *!',0dh,0ah,'$'
mess2 db 'Hello! This is interrupt * 1 *!',0dh,0ah,'$'
mess3 db 'Hello! This is interrupt * 2 *!',0dh,0ah,'$'
mess4 db 'Hello! This is interrupt * 3 *!',0dh,0ah,'$'
mess5 db 'Hello! This is interrupt * 4 *!',0dh,0ah,'$'
mess6 db 'Hello! This is interrupt * 5 *!',0dh,0ah,'$'
mess7 db 'Hello! This is interrupt * 6 *!',0dh,0ah,'$'
mess8 db 'Hello! This is interrupt * 7 *!',0dh,0ah,'$' data ends
stacks segment db 100 dup() stacks ends
STACK1 SEGMENT STACK DW 256 DUP() STACK1 ENDS
CODE SEGMENT ASSUME
CS:CODE,DS:DATA,SS:stacks,ES:DATA .386
START: mov ax,data mov ds,ax mov es,ax mov ax,stacks mov ss,ax
MOV DX,I8259_1 ;初始化8259的ICW1
MOV AL,13H ;边沿触发、单片8259、需要ICW4
4
OUT DX,AL CMP AL,02H
JE IR2ISR MOV DX,I8259_2 ;初始化8259 CMP AL,03H 的ICW4
JE IR3ISR MOV AL,0B0H ;非自动结束 CMP AL,04H EOI
JE IR4ISR OUT DX,AL CMP AL,05H ;MOV AL,00H JE IR5ISR ;OUT DX,AL CMP AL,06H MOV AL,03H JE IR6ISR OUT DX,AL CMP AL,07H
JE IR7ISR MOV DX,O8259_1 ;初始化 JMP QUERY 8259的OCW1
MOV AL,00H ;打开IR0和IR1IR0ISR: MOV AX,DATA 的屏蔽位
MOV DS,AX
OUT DX,AL MOV DX,offset mess1 ;
信息
QUERY: MOV AH,1 ;判断是否 MOV AH,09 有按键按下 INT 21H INT 16H
JMP EOI JNZ QUIT ;有按键则退出
IR1ISR: MOV AX,DATA MOV DX,O8259_3 ;向8259的 MOV DS,AX
OCW3发送查询命令 MOV DX,offset mess2 ; MOV AL,0CH 信息
OUT DX,AL MOV AH,09 INT 21H
JMP EOI IN AL,DX ;读出查询字
MOV AH,AL IR2ISR: MOV AX,DATA AND AL,80H
MOV DS,AX
TEST AL,80H ;判断中断是否 MOV DX,offset mess3 ;已响应
信息
JZ QUERY ;没有响应则继续 MOV AH,09 查询
INT 21H MOV AL,AH JMP EOI
AND AL,07H IR3ISR: MOV AX,DATA CMP AL,00H
MOV DS,AX
JE IR0ISR ;若为IR0请求, MOV DX,offset mess4 ;跳到IR0处理程序 信息
CMP AL,01H
MOV AH,09 JE IR1ISR ;若为IR1请求, INT 21H 跳到IR1处理程序
JMP EOI
5
显示提示显示提示显示提示显示提示IR4ISR: MOV AX,DATA MOV DS,AX
MOV DX,offset mess5 ;显示提示信息
MOV AH,09 INT 21H JMP EOI
IR5ISR: MOV AX,DATA MOV DS,AX
MOV DX,offset mess6 ;显示提示信息
MOV AH,09 INT 21H JMP EOI
IR6ISR: MOV AX,DATA MOV DS,AX
MOV DX,offset mess7 ;显示提示信息
MOV AH,09 INT 21H JMP EOI
IR7ISR: MOV AX,DATA MOV DS,AX
MOV DX,offset mess8 ;显示提示信息
MOV AH,09 INT 21H
EOI:
MOV DX,O8259_2 ;向8259发送中断结束命令 MOV AL,20H OUT DX,AL JMP QUERY
QUIT: MOV AX,4C00H ;结束程序退出
INT 21H
CODE ENDS END START
;*******************************; ;* DMA传送实验(块传送) *;
6
;* 2008年2月为8237扩展板修改 *; ;*******************************; io8237 equ 280h ;从8237地址 code segment assume cs:code start:
mov ax,0D000h mov es,ax mov bx,4000h
mov cx,0ffH;传输个数 mov dl,40h;字符A rep1: inc dl mov es:[bx],dl inc bx
cmp dl,5ah jnz ss1 mov dl,40h ss1: loop rep1
mov dx,18h ;关闭主8237 mov al,04h out dx,al
mov dx,1dh ;复位主8237 mov al,00h out dx,al
mov dx,18h ;开启主8237,DACK信号高有效 mov al,80h out dx,al
mov dx,1bh ;主8237为级联方式
mov al,0c0h out dx,al
mov dx,io8237+08h ;关闭从8237
mov al,04h out dx,al
mov dx,io8237+0dh ;复位从8237
mov al,00h out dx,al
mov dx,io8237+02h ;写目的地址低位
mov al,00h out dx,al
mov dx,io8237+02h ;写目的地址高位
mov al,42h out dx,al
mov dx,io8237+03h ;传送字节数低位
mov al,0ffh out dx,al
mov dx,io8237+03h ;传送字节数高位
mov al,00h out dx,al
mov dx,io8237+00h ;源地址低位
mov al,00h out dx,al
mov dx,io8237+00h ;源地址高位
mov al,40h out dx,al
mov dx,io8237+0bh ;通道1写传输,地址增 mov al,85h out dx,al
mov dx,io8237+0bh ;通道0读传输,地址增 mov al,88h out dx,al
mov dx,io8237+08h ;DREQ低电平有效,存储器到存储器,开启从8237
mov al,41h out dx,al
mov dx,io8237+09h ;通道1请求
mov al,04h out dx,al
mov cx,0F000h delay: loop delay
mov ax,0D000h mov es,ax
mov bx,04200h;目的地址起始 mov cx,0ffh;读出字符个数 rep2: mov dl,es:[bx] mov ah,02h int 21h inc bx loop rep2 mov ax,4c00h int 21h code ends end start
;******************* ;* 8253分频 *
;******************* io8253a equ 280h io8253b equ 281h io8253c equ 283h code segment assume cs:code
start:mov dx,io8253c ;向8253写控制字
mov al,36h ;使0通道为工作方式3
out dx,al
mov ax,1000 ;写入循环计数初值1000
mov dx,io8253a
out dx,al ;先写入低字节 mov al,ah
out dx,al ;后写入高字节 mov dx,io8253c
mov al,76h ;设8253通道1工作方式2 out dx,al
mov ax,1000 ;写入循环计数初值1000
7
mov dx,io8253b
out dx,al ;先写低字节 mov al,ah
out dx,al ;后写高字节 mov ah,4ch ;程序退出 int 21h code ends end start
;*************************; ;* 8253方式0计数器实验 *; ;*************************; io8253a equ 283h io8253b equ 280h code segment assume cs:code
start: mov al,14h ;设置8253通道0为工作方式2,二进制计数 mov dx,io8253a out dx,al
mov dx,io8253b ;送计数初值为0FH
mov al,0fh out dx,al
lll: in al,dx ;读计数初值 call disp ;调显示子程序 push dx mov ah,06h mov dl,0ffh int 21h pop dx jz lll
mov ah,4ch ;退出 int 21h
disp proc near ;显示子程序 push dx
and al,0fh ;首先取低四位 mov dl,al
cmp dl,9 ;判断是否<=9
jle num ;若是则为'0'-'9',ASCII码加30H
add dl,7 ;否则为'A'-'F',ASCII码加37H
num: add dl,30h
mov ah,02h ;显示
int 21h
mov dl,0dh ;加回车符 int 21h
mov dl,0ah ;加换行符 int 21h pop dx
ret ;子程序返回 disp endp code ends end start
对不起,我题找不到了,但是我可以告诉你重点在哪 2012的题编程很多,但是选择填空都是很基本的问题。不像之前做的模拟题,而且编程题很综合,涉及到DOS层调用(调用软中段输入和显示),
8259,8255,8254这几个东西的编程,7段数码管,串口通信,波特率计算。所以你基础的汇编语言的编写得熟悉,然后就是书上那些例程得看明白,像什么WINDOWS什么,我忘了具体是哪一节的那块可以不用看,DMA芯片大概看一下应该不会出编程。重点章节有:第一章,第二章第一节,第二节随意看看,第三章一到六节,节,第五章,第六章123节,第八章1到6节第九章1,2节,第十章。好好看,祝你成功
8
因篇幅问题不能全部显示,请点此查看更多更全内容