微机实验程序.docx
《微机实验程序.docx》由会员分享,可在线阅读,更多相关《微机实验程序.docx(25页珍藏版)》请在冰点文库上搜索。
微机实验程序
实验一
;*------------------------------------------------*
;*Aexp1.asm(汇编语言编程认识实验)*
;*Copyright(c)2002byHUST*
;*程序调试:
在EXIT处设置断点,利用AddWatch命令*
;*查看BUF1和BUF2的内容是否正确*
;*-----------------------------------------------*
DATASEGMENT
BUF1DB'MASMHELLOWORLD'
COUNTEQU$-BUF1
BUF2DB20DUP(?
)
DATAENDS
STACK1SEGMENTSTACK
DB20DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK1,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETBUF1;建立源地址指针
MOVDI,OFFSETBUF2;建立目标地址指针
MOVCX,COUNT;字节数送入CX寄存器
L1:
MOVAL,[SI];取源数据一个字节送入AL中
MOV[DI],AL;将源数据送入目标地址单元中
INCSI
INCDI
DECCX
JNZL1;判断是否传送完毕
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
实验二
;*-------------------------------------------------------------------------*
;*Aexp3.asm(运算类指令编程实验)*
;*Copyright(c)2002byHUST*
;*程序调试:
在MOVAH,4CH处设置断点,利用AddWatch命令查看ZH中的内容是否正确*
;*-------------------------------------------------------------------------*
STACK1SEGMENTSTACK
DW64DUP(?
)
STACK1ENDS
DATASEGMENT
XLDW2;请在此处给X低位赋值
XHDW2;请在此处给X高位赋值
YLDW4;请在此处给Y低位赋值
YHDW4;请在此处给Y高位赋值
ZLDW?
ZHDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,XL;X的低位送AX
ADDAX,YL;X的低位加Y的低位
MOVZL,AX;存低位和
MOVAX,XH;X的高位送AX
ADCAX,YH;X的高位加Y的高位,同时加上CF
MOVZH,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
实验三
1.分支程序
;*-------------------------------------------------------*
;*Aexp4.asm(分支程序设计实验)*
;*Copyright(c)2002byHUST*
;*程序调试:
在EXIT:
MOVAH,4CH处设置断点,利用AddWatch*
;*命令查看A中的内容是否正确*
;*-------------------------------------------------------*
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
DATASEGMENT
XDB-2
YDB8
ADB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
CMPX,0;x与0进行比较
JSL1;x<0转L1
CMPY,0
JLL2;y<0转L2
MOVA,1;1送A
JMPEXIT
L1:
CMPY,0
JGEL2;y>=0转L2
MOVA,-1;x<0,y<0时,-1送A
JMPEXIT
L2:
MOVA,0;x与y异号时,0送A
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2.循环程序
;*-----------------------------------------------------------------------*
;*Aexp5.asm(循环程序设计实验)*
;*Copyright(c)2002byHUST*
;*程序调试:
在MOVAH,4CH处设置断点,利用AddWatch命令查看R中的内容是否正确*
;*------------------------------------------------------------------------*
STACKSEGMENTSTACK
DB200DUP(?
)
STACKENDS
DATASEGMENT
BUFDW-6,90,100,-3,-1,5,0,134;比较的数据
NEQU($-BUF)/2;个数
RDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
LEASI,BUF;取存储区首址
MOVBL,0;BL存放负数个数的初值
MOVCX,N;CX中存放数据个数的初值
L1:
MOVAX,[SI];取存储区数据
CMPAX,0
JGEA2
INCBL;负数则BL加1
A2:
ADDSI,2
DECCX
JNZL1
MOVR,BL;;将结果放入R中
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
实验四
;*-------------------------------------------------------*
;*Aexp13.asm扩展存储器实验*
;*Copyright(c)2002byHUST*
;*运行步骤:
1.将平台板上存储器电源的跳接开关联上*
;*2.程序编译、连接后,进行调试*
;*3.在主程MOVAH,4CH处设置断点,利用AddWatch*
;*命令查看BUF2中的内容是否和BUF1的内容一致*
;*------------------------------------------------------*
STACK1SEGMENTSTACK
DB200DUP(?
)
STACK1ENDS
DATASEGMENT
BUF1DB"helloworld!
"
NEQU$-BUF1
BUF2DBNDUP(?
)
RAMBASEEQU0E100H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX
;WRITERAM;写存储器6264RAM
PUSHSI
PUSHBX
PUSHCX
PUSHAX
MOVSI,OFFSETBUF1;主存BUF1的首址送入SI
MOVBX,RAMBASE;6264RAM存储区基址送BX
MOVCX,N;字节个数送CX
MOVDX,303H;设置8255工作方式
MOVAL,80H;10000000B
OUTDX,AL
L1:
MOVDX,302H;从8255的C口
MOVAL,BH;输出地址的高8位
OUTDX,AL
MOVDX,301H;从8255的B口
MOVAL,BL;输出地址的低8位
OUTDX,AL
MOVDX,303H;置写信号为低电平
MOVAL,0EH;00001110B(置PC7=0)
OUTDX,AL
MOVDX,300H;从8255的A口
MOVAL,[SI];输出8位数据
OUTDX,AL
MOVDX,303H;置写信号变为高电平
MOVAL,0FH;00001111B(置PC7=1)
OUTDX,AL
INCSI;主存地址加1
INCBX;6264RAM地址加1
LOOPL1;未完,继续写
POPAX
POPCX
POPBX
POPSI
;READRAM;读存储器6264RAM
PUSHSI
PUSHBX
PUSHCX
PUSHAX
MOVSI,OFFSETBUF2;主存BUF2的首址送SI
MOVBX,RAMBASE;6264RAM存储区基址送BX
MOVCX,N;字节个数送CX
MOVDX,303H;设置8255工作方式
MOVAL,90H;10010000B
OUTDX,AL
L2:
MOVDX,302H;从8255的C口
MOVAL,BH;输出地址的高8位
OUTDX,AL
MOVDX,301H;从8255的B口
MOVAL,BL;输出地址的低8位
OUTDX,AL
MOVDX,303H;置读信号为低电平
MOVAL,0CH;00001100B(置PC6=0)
OUTDX,AL
MOVDX,300H;从8255A口读数据
INAL,DX
MOV[SI],AL;数据存到BUF2中。
MOVDX,303H;置读信号变为高电平
MOVAL,0DH;00001101B(置PC6=1)
OUTDX,AL
INCSI;主存地址加1
INCBX;6264RAM地址加1
LOOPL2;未完,继续读
POPAX
POPCX
POPBX
POPSI
MOVAH,4CH;程序退出
INT21H
CODEENDS
ENDSTART
实验五
;*********************************************************************
;Aexp8.asm走马灯(灯光变幻)程序*
;内容:
用DIP的8位开关控制走马灯的花样,用SW3控制走马灯的起/停
;运行步骤:
1.按下一次开关SW3,开始灯光变幻,再按下一次则停止;可重复进行*
;2.按下SW3后,拨动不同的数码开关DIP,就会出现不同的灯光变幻*
;3.按下"q"或者"Q",退出*
;*********************************************************************
ssegsegmentparastack'stack'
dw200dup(?
)
ssegends
dsegsegmentparapublic'data'
messagedb'pressSW3tostartandthenpressSW3tostop,andsoon!
',0ah,0dh;系统提示信息
db'turnonDIPonebyoneanddisplayvarioussoud-oppatterns!
'
db0ah,0dh
db'ifyouwanttoquit,pleasehit''q''or''Q''!
',0ah,0dh,'$'
flagdb0;初始化状态标志变量为0
tdw0;初始化延时变量为0
numdw0;初始化数字变量为0
data1db80h,40h,20h,10h,08h,04h,02h,01h;八种不同的灯光变幻组合
data2db01h,02h,04h,08h,10h,20h,40h,80h
data3db80h,20h,08h,02h,40h,10h,04h,01h
data4db01h,04h,10h,40h,02h,08h,20h,80h
data5db0c0h,30h,0ch,03h,0c0h,30h,0ch,03h
data6db03h,0ch,30h,0c0h,03h,0ch,30h,0c0h
data7db81h,42h,24h,18h,81h,42h,24h,18h
data8db18h,24h,42h,81h,18h,24h,42h,81h
dsegends
csegsegmentparapublic'code'
assumess:
sseg,cs:
cseg,ds:
dseg
mprocfar
start:
movax,ds
pushax
movax,00h
pushax;保留程序数据段地址
movah,09h;显示系统提示信息
movdx,segmessage
movds,dx
movdx,offsetmessage
int21h
;初始化8255
movdx,303h;取8255的控制端口的地址
moval,83h;初始化8255的A口和C口高四位为输出模式
outdx,al;B口和C口低四位为输入模式
;初始化灯LED全灭
movdx,300h;取8255的端口A的地址
moval,00h;使8255的PA0-PA7全为0
outdx,al;使所有的灯LED全灭
wait:
;检测"q"或者"Q"键
movah,0bh
int21h;调用DOS21H功能0BH进行键盘判断
incal
jnzreadpc;检测是否有键按下
movah,08h
int21h;调用DOS21H功能08H进行键盘输入判断
cmpal,'q'
jzquit;检测到"q",退出
cmpal,'Q'
jzquit;检测到"Q",退出
readpc:
;判断开关SW3的状态
movdx,302h;取8255的端口C的地址
inal,dx;读端口C的值
;当按下开关SW3时,PC2口为低电平
testal,04h;检测PC2口状态
jnzcase
lp:
inal,dx
testal,04h
jzlp;循环检测直至放开
xorflag,01h;将状态值取反
case:
cmpflag,01h;进行状态值比较
jnestop
begin:
callledflash;调用灯光变幻过程
calldelay2
jmpwait
;灯LED全灭
stop:
movdx,300h;取8255的端口A的地址
moval,00h;使8255的PA0-PA7全为0
outdx,al;使所有的灯LED全灭
jmpwait
quit:
;灯LED全灭
movdx,300h;取8255的端口A的地址
moval,00h;使8255的PA0-PA7全为0
outdx,al;使所有的灯LED全灭
;返回DOS
movah,4ch;DOS功能调用
int21h;返回DOS
mendp
delay2proc
pushcx
pushbx
movcx,02ffh
dl4:
movbx,0ffffh
dl3:
decbx
jnzdl3
deccx
jnzdl4
popbx
popcx
ret
delay2endp
;检测数码开关DIP的状态,以便产生八种不同的灯光变幻
ledflashproc
movdx,301h;取8255的端口B的地址
inal,dx;读端口B的值
cmpal,0feh;检测PB0口是否为0
jnechoice1
movsi,offsetdata1;置第一种灯光变幻组合
jmphere
choice1:
cmpal,0fdh;检测PB1口是否为0
jnechoice2
movsi,offsetdata2;置第二种灯光变幻组合
jmphere
choice2:
cmpal,0fbh;检测PB2口是否为0
jnechoice3
movsi,offsetdata3;置第三种灯光变幻组合
jmphere
choice3:
cmpal,0f7h;检测PB3口是否为0
jnechoice4
movsi,offsetdata4;置第四种灯光变幻组合
jmphere
choice4:
cmpal,0efh;检测PB4口是否为0
jnechoice5
movsi,offsetdata5;置第五种灯光变幻组合
jmphere
choice5:
cmpal,0dfh;检测PB5口是否为0
jnechoice6
movsi,offsetdata6;置第六种灯光变幻组合
jmphere
choice6:
cmpal,0bfh;检测PB6口是否为0
jnechoice7
movsi,offsetdata7;置第七种灯光变幻组合
jmphere
choice7:
cmpal,7fh;检测PB7口是否为0
jnechoice0
movsi,offsetdata8;置第八种灯光变幻组合
jmphere
;choice0:
callm0;调用声光变幻过程
choice0:
jmpwait
;送加电数据
here:
addsi,num
moval,[si];取当前加电数据
movdx,300h;取8255的端口A的地址
outdx,al;输出加电数据到端口A
incnum;改变数字变量的值
cmpnum,08h
jnenext
movnum,00h
next:
ret
ledflashendp
csegends
endstart
实验七
;*---------------------------------------------------------*
;*Aexp14.asm中断控制器8259应用实验-中断方式控制彩灯点亮*
;*中断方式控制彩灯点亮程序sourcefile*
;*运行步骤:
1.将PC4和IRQ10两个跳接开关分别联上*
;*2.按下1次SW3,申请1次中断,使LED灯点亮1次*
;*Copyright(c)2002byHUST*
;*---------------------------------------------------------*
STACK1SEGMENTSTACK
DW200DUP(?
)
STACK1ENDS
DATASEGMENT
MESG1DB'PressSW3onetimetoinvokeinterruptonetime,andtolightoneofLEDs',0ah,0dh
DB'Exitwithq/Q',0ah,0dh,'$'
LEDDATADB01H,02H,04H,08H,10H,20H,40H,80H
NUMDW(0)
INT0A_OFFDW(?
)
INT0A_SEGDW(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAH,09H
MOVDX,OFFSETMESG1
INT21h;显示提示信息
MOVDX,303H;初始化8255
MOVAL,83H
OUTDX,AL
MOVDX,300H;LED灯熄灭
MOVAL,00H
OUTDX,AL
MOVAX,3572H;获取原中断向量
INT21H
MOVINT0A_OFF,BX;保存原中断向量
MOVBX,ES
MOVINT0A_SEG,BX
CLI;关中断
MOVAX,2572H
MOVDX,SEGLEDLIGHT;设置新的中断向量
PUSHDS
MOVDS,DX
MOVDX,OFFSETLEDLIGHT
INT21H
POPDS
STI;开中断
INAL,0A1H;打开IRQ10
ANDAL,0FBH
OUT0A1H,AL
INAL,21H;打开IRQ2
ANDAL,0FBH
OUT21H,AL
L1:
MOVAH,0BH;检查是否有’Q’或’q’键按下
INT21H
INCAL
JNZNEXT0;若无键按下,则程序往下执行
MOVAH,08H;如有’Q’或’q’键按下,则程序退出
INT21H
CMPAL,'q'
JZEXIT
CMPAL,'Q'
JZEXIT
NEXT0:
MOVDX,302H;查PC2是否为0
INAL,DX
ANDAL,04H
JNZL1
MOVDX,303H;按下SW3,则PC4=1申请中断
MOVAL,09H
OUTDX,AL
PUSHCX
MOVCX,100
WT:
LOOPWT
POPCX
MOVDX,303H;置PC4=0
MOVAL,08H
OUTDX,AL
JMPL1
EXIT:
MOVAX,2572H;恢复中断向量
MOVDX,INT0A_SEG
PUSHDS
MOVDS,DX
MOV