汇编语言与接口技术实验报告.docx
《汇编语言与接口技术实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言与接口技术实验报告.docx(28页珍藏版)》请在冰点文库上搜索。
汇编语言与接口技术实验报告
汇编语言与接口技术
实验报告
学院:
信息与电子工程学院
专业:
班级:
学号:
姓名:
浙江科技学院
2012-2013学年第1学期
实验1汇编语言程序设计
一、实验目的
1.熟悉MASM6.11汇编语言程序开发环境。
2.掌握汇编语言程序的调试方法和常用的调试工具。
二、实验内容
1.安装MASM6.11。
2.设在内存中首地址为BLOCK的区域存有一批数据:
61H,84H,93H,0C4H,17H,0FFH,52H,2AH。
分别按下列要求编写汇编语言程序:
(1)视该批数据为8位无符号数,采用冒泡法将其按升序排序;
(2)视该批数据为8位有符号数,采用冒泡法将其按升序排序。
三、实验要求
1.根据实验内容编写程序。
2.上机调试程序。
3.记录并分析程序运行结果。
四、程序说明和程序流程图
五、程序代码
1.8位无符号数冒泡法排序程序如下:
.modelsmall
.data
ndw8
blockdb61h,84h,93h,0c4h,17h,0ffh,52H,2ah
.stack60h
.code
.startup
movax,@data
movds,ax
movcx,n
deccx
loop1:
movdx,cx
movbx,0
loop2:
moval,block[bx]
cmpal,block[bx+1]
jnacontinue
xchgal,block[bx+1]
movblock[bx],al
continue:
addbx,1
looploop2
movcx,dx
looploop1
.exit
end
2、8位有符号数冒泡排序程序如下
.modelsmall
.data
ndw8
blockdb61h,84h,93h,0c4h,17h,0ffh,52H,2ah
.stack60h
.code
.startup
movax,@data
movds,ax
movcx,n
deccx
loop1:
movdx,cx
movbx,0
loop2:
moval,block[bx]
cmpal,block[bx+1]
jlecontinue
xchgal,block[bx+1]
movblock[bx],al
continue:
addbx,1
looploop2
movcx,dx
looploop1
.exit
end
六、程序运行结果及分析
在命令行debug,反汇编找到初始程序入口0017
查看cup寄存器的内容
实验2系统中断接口实验
一、实验目的
1.熟悉可编程中断控制器8259A的使用方法。
2.掌握软、硬件中断的编程技术。
二、实验内容
1.软件中断
自定义一个软件中断,中断类型码为78H。
在中断服务程序中,完成ASCII码到压缩的BCD码的转换,ASCII码内存首地址为ASCADDR,长度为NUMBER,转换后的BCD码存放在以BCDADDR为首地址的存储区中。
2.硬件中断
设IRQ10~IRQ12(中断类型号为72H~74H)接外部硬件中断源1~3,外部中断源的中断请求通过按数字键“1”~“3”模拟产生。
在中断服务程序中显示“Interruptserviceroutinen(n=1~3)isrunning…”字样。
三、实验要求
1.编写主程序和中断服务程序。
2.上机调试程序。
3.记录并分析程序运行结果。
四、程序说明和程序流程图
是
开始
定义软件中断
ASCⅡ压缩
是否压缩完成?
结束
否
开始
设置外部硬件中断
显示字样
是否按数字键?
否
是
结束
五、程序代码
实验1代码:
dsegsegment
ascaddrdb'0123456789'
numberdb10
bcdaddrdb20dup(?
)
dsegends
csegsegment
assumecs:
cseg,ds:
dseg
start:
pushds
xorax,ax
pushax
movax,segasc_bcd
movds,ax
movdx,offsetasc_bcd
movax,2578h
int21h
int78h
retf
asc_bcdproc
movax,dseg
movds,ax
movsi,offsetascaddr
movdi,offsetbcdaddr
movch,number
shrch,1
movcl,4
cont:
movax,[si]
andal,0fh
shlah,cl
oral,ah
mov[di],al
addsi,2
incdi
decch
jnzcont
iret
asc_bcdendp
csegends
endstart
实验2代码:
dsegsegment
disp1db'Interruptserviceroutine1isrunning...',0ah,0dh,'$'
disp2db'Interruptserviceroutine2isrunning...',0ah,0dh,'$'
disp3db'Interruptserviceroutine3isrunning...',0ah,0dh,'$'
dsegends
csegsegment
assumecs:
cseg,ds:
dseg
start:
pushds
xorax,ax
pushax
movax,segisradd1
movds,ax
movdx,offsetisradd1
movax,2572h
int21h
movax,segisradd2
movds,ax
movdx,offsetisradd2
movax,2573h
int21h
movax,segisradd3
movds,ax
movdx,offsetisradd3
movax,2574h
int21h
inal,0a1h
andal,11100011b
out0a1h,al
keyin:
movah,0
int16h
cmpal,'1'
jzserve1
cmpal,'2'
jzserve2
cmpal,'3'
jzserve3
cmpal,'q'
jzexit
jmpkeyin
serve1:
int72h
jmpkeyin
serve2:
int73h
jmpkeyin
serve3:
int74h
jmpkeyin
exit:
retf
isradd1proc
pushds
pushax
movax,segdisp1
movds,ax
movdx,offsetdisp1
movah,9
int21h
;moval,20h
;out0a0h,al
popax
popds
iret
isradd1endp
isradd2proc
pushds
pushax
movax,segdisp2
movds,ax
movdx,offsetdisp2
movah,9
int21h
;moval,20h
;out0a0h,al
popax
popds
iret
isradd2endp
isradd3proc
pushds
pushax
movax,segdisp3
movds,ax
movdx,offsetdisp3
movah,9
int21h
;moval,20h
;out0a0h,al
popax
popds
iret
isradd3endp
csegends
endstart
六、程序运行结果及分析
实验1内存结果
实验2:
实验3键盘接口实验
一、实验目的
1.了解键盘接口的工作原理。
2.掌握直接在硬件基础上编写键盘处理程序的方法。
3.熟悉键盘的BIOS和DOS功能调用。
二、实验内容
设计一个中断方式的用户键盘处理程序,其功能是直接从数据端口(8255的PA端口,地址为60H)读取键盘的扫描码,并通过换码指令XLAT将扫描码转换为ASCII字符显示在屏幕上。
当程序运行时,可通过键入ESC键,使键盘的管理在用户键盘处理程序和系统键盘处理程序(INT09H)之间进行切换。
三、实验要求
1.编写主程序和中断服务程序。
2.上机调试程序。
3.记录并分析程序运行结果。
四、程序说明和程序流程图
键盘扫描
有键闭合
延时去键抖动
扫描键盘
找到闭合键
计算键值
建立有效标志
返回
N
N
Y
建立有效标志
闭合键释放
Y
五、主程序和中断服务程序代码
csegsegment
org100h
assumecs:
cseg
start:
jmpinstall
flagdb0
oldintdd?
scantabdb0,0,'1234567890-=',08h,0
db'QWERTYUIOP[]',0dh,0
db'ASDFGHJKL;',0,0,0,0
db'ZXCVBNM,./',0,0,0,20h
db13dup(0)
db'789-456+1230#'
kbint:
pushax
pushbx
pushds
pushcs
popds
sti
movbx,offsetscantab
inal,60h
testal,80h
jnzkeyend
pushax
inal,61h
oral,80h
out61h,al
andal,7fh
out61h,al
popax
cmpal,01h
jnzdisp
incflag
disp:
testflag,01h
jzuser
popds
popbx
popax
jmpcs:
oldint
user:
xlat
cmpal,0
jzkeyend
movah,14
int10h
moval,0dh
int10h
moval,0ah
int10h
keyend:
moval,20h
out20h,al
popds
popbx
popax
iret
install:
cli
pushcs
popds
movax,3509h
int21h
cmpbx,offsetkbint
jnzload
int20h
load:
movwordptroldint,bx
movwordptroldint+2,es
movdx,offsetkbint
movax,2509h
int21h
inal,21h
andal,11111101b
out21h,al
sti
movdx,offsetinstall
int27h
csegends
endstart
六、程序运行结果及分析
1.当执行程序后,输入小写字母显示大写,键入ESC后切换到操作系统自己的中断,输入小写显示小写。
实验4显示器接口实验
一、实验目的
1.了解显示器接口的工作原理。
2.熟悉显示器的BIOS和DOS功能调用。
二、实验内容
在屏幕上显示一张移动的“笑脸”。
“笑脸”字符的ASCII码为01H或02H,要使“笑脸”动起来,可按如下步骤编程:
1.屏幕上显示“笑脸”;
2.延迟一段时间;
3.清除“笑脸”(可用清除部分屏幕或在“笑脸”位置显示空字符的方法实现);
4.改变“笑脸”的行、列坐标;
5.返回第1步,重复上述过程。
三、实验要求
1.根据实验内容编写程序。
2.上机调试程序。
3.记录并分析程序运行结果。
四、程序说明和程序流程图
否
开始
在屏幕上显示笑脸
延迟一段时间
清除笑脸
改变笑脸的行、列坐标
是否返回?
结束
是
五、程序代码
stacksegment
db256dup
(1)
stackends
codesegment
move_faceprocfar
assumecs:
code,ds:
stack
start:
pushds
subax,ax
pushax
movah,15
int10h
movah,0
moval,1
int10h
movcx,1
movdx,0
sti
move_cursor:
movah,2
int10h
moval,1
movah,10
int10h
calldelay
subal,al
movah,10
int10h
incdh
incdl
cmpdh,25h
jnemove_cursor
ret
move_faceendp
delayproc
pushbx
pushcx
pushdx
movah,0
int1ah
adddx,9
movbx,dx
redo:
int1ah
cmpdx,bx
jneredo
popdx
popcx
popbx
ret
delayendp
codeends
end
六、程序运行结果及分析
实验5串行通信接口实验
一、实验目的
1.熟悉可编程串行通信接口8250A的使用方法。
2.掌握串行通信接口的编程技术。
二、实验内容
1.两台微机利用COM1(串行口1)进行查询式通信,可采用三线式连接方法。
双机通信的要求如下:
7位数据位、偶校验、1位停止位、波特率为9600;双机同时运行通信程序,一方键入的字符在另一方的屏幕上显示,当按下字符'q'时,结束通信返回DOS。
2.用中断方式实现上述1的功能。
3.用BIOS调用发送和接收字符。
三、实验要求
1.编写查询式通信程序。
2.编写中断式通信程序。
3.编写用BIOS调用实现的自发自收的通信程序。
4.上机调试程序。
5.记录并分析程序运行结果。
四、程序说明和程序流程图
查询方式发送
初始化8250
读LSR
再次验收
Y
Y
N
D4~D1=0?
D0=1?
接收一个字符
接收完毕?
暂时结束
处理错误
N
Y
N
查询方式验收
五、程序代码
实验1代码:
scomsegmentparastack'scom'
db256dup(0)
scomends
dcomsegment
db50dup(?
)
dcomends
ccomsegmentparapublic'ccom'
startprocfar
assumecs:
ccom,ss:
scom,ds:
dcom
pushds
xorax,ax
pushax
movdx,3fbh
moval,10000000b
outdx,al
movdx,3f8h
moval,0ch
outdx,al
incdx
moval,0
outdx,al
movdx,3fbh
moval,00011010b
outdx,al
incdx
moval,00010011b
outdx,al
movdx,3f9h
moval,0
outdx,al
cont:
movdx,3fdh
inal,dx
testal,00011110b
jnzerror
testal,00000001b
jnzdelre
testal,00100000b
jzcont
movah,1
int16h
jzcont
movah,0
int16h
cmpal,'q'
jzreturn
movdx,3f8h
outdx,al
jmpcont
delre:
movdx,3f8h
inal,dx
andal,01111111b
pushax
movbl,0
movah,0eh
int10h
popax
cmpal,0dh
jnzcont
moval,0ah
movbl,0
movah,0eh
int10h
jmpcont
error:
movdx,3f8h
inal,dx
moval,'?
'
movbl,0
movah,0eh
int10h
jmpcont
return:
ret
startendp
ccomends
endstart
实验3代码:
scomsegmentparastack'scom'
db256dup(0)
scomends
dcomsegment
db50dup(?
)
dcomends
ccomsegmentparapublic'ccom'
startprocfar
assumecs:
ccom,ss:
scom,ds:
dcom
pushds
xorax,ax
pushax
movah,0
moval,11111010b
movdx,0
int14h
cont:
movah,1
int16h
jzcont
movah,0
int16h
cmpal,'q'
jzexit
movah,1
int14h
movah,2
int14h
movbl,0
movah,0eh
int10h
cmpal,0dh
jnzcont
moval,0ah
movbl,0
movah,0eh
int10h
jmpcont
exit:
retf
startendp
ccomends
endstart
六、程序运行结果及分析
实验1:
实验3: