实验报告
班级:04120902
姓名:庄幽文
学号:2009056
实验1:
题目:
—两个多位十进制数相加:将两个多位十进制数相加,要求加数均以ASCII码形式各自顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
流程图:
程序源码:
data segment ;By Xdestiny 04120902 20090956
data1 db 6,?,6 dup(30h) ;加数
data2 db 6,?,6 dup(30h) ;被加数
data ends
stack segment stack
db 200 dup(?)
stack ends
code segment
assume cs:code,ss:stack,ds:data
begin:
mov ax,data
mov ds,ax
mov ah,0ah ;读取加数与被加数
mov dx,offset data1
int 21h
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
mov ah,0ah
mov dx,offset data2
int 21h
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
mov si,offset data1
mov ax,[si+1]
and ax,00ffh
mov bx,ax
mov byte ptr[bx+si+2],'0' ;将未用到的数字位置0
mov di,offset data2
mov bx,[di+1]
and bx,00ffh
mov byte ptr[bx+di+2],'0' ;将未用到的数字位置0
mov cx,2
push ax
div cl
cmp al,0
jz re
and ax,00ffh
mov cx,ax
pop ax ;将低位放在存储器的低地址,高位放高地址
ch1: push si
push bx
mov bx,cx
mov dl,[bx+si+1]
push bx
mov bx,ax
sub bx,cx
mov dh,[bx+si+2]
mov [bx+si+2],dl
pop bx
mov [bx+si+1],dh
pop bx
pop si
loop ch1
re: mov cx,2
push ax
mov ax,bx
div cl
cmp al,0
jz ren
and ax,00ffh
mov cx,ax
pop ax
ch2: push di ;将低位放在存储器的低地址,高位放高地址
push ax
push bx
mov ax,bx
mov bx,cx
mov dl,[bx+di+1]
push bx
mov bx,ax
sub bx,cx
mov dh,[bx+di+2]
mov [bx+di+2],dl
pop bx
mov [bx+di+1],dh
pop bx
pop ax
pop si
loop ch2
ren: mov si,offset data1
mov di,offset data2
mov cx,5 ;进行5位数的加法
push cx
Mlen: mov bx,1
mov ah,0
sahf
cal: mov al,[si+1+bx] ;逐位进行加法运算
pushf
sub al,30h
mov ah,[di+1+bx]
sub ah,30h
popf
adc al,ah
pushf
and ax,00ffh
popf
aaa
mov [si+1+bx],al
cmp ah,0
jz carry ;大于10则C标志位置1
stc
carry: inc bx
loop cal
pop cx
jnc ex1
jc ot1
ex1: mov bx,cx
cmp byte ptr[bx+si+1],0 ;没进位则除去高位的0
loopz ex1
inc cx
jmp ot
ot1: mov dl,'1' ;最高位有进位则输出一个1
mov ah,2
int 21h
ot: mov bx,cx ;将得数按位输出
mov dl,[si+1+bx]
or dl,30h
mov ah,2
int 21h
loop ot
mov ah,4ch
int 21h
code ends
end begin
程序运行结果:
实验2:
题目:
—BCD码相乘:实现BCD码的乘法,要求被乘数和乘数(0~99)以压缩BCD码形式存放,各占1个字节内存单元。乘积存放在另外2个字节内存单元中。
流程图:
程序源码:
data segment ;By Xdestiny 04120902 20090956
data1 db 3 ;被乘数
db ?
db 3 dup(30h)
data2 db 3 ;乘数
db ?
db 3 dup(30h)
data ends
stack segment stack
db 200 dup(?)
stack ends
code segment
assume cs:code,ds:data,ss:stack
begin:
mov ax,data
mov ds,ax
mov ah,0ah
mov dx,offset data1
int 21h
mov bx,dx
mov cl,[bx+1] ;CL中存放数的位数
cmp cl,1
jnz mul2 ;如果为1位数则高位添0
mov al,[bx+2]
mov byte ptr[bx+2],30h
mov [bx+3],al
mul2: mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
mov ah,0ah
mov dx,offset data2
int 21h
mov bx,dx
mov cl,[bx+1] ;CL中存放数的位数
cmp cl,1
jnz deal ;如果为1位数则高位添0
mov al,[bx+2]
mov byte ptr[bx+2],30h
mov [bx+3],al
deal: mov ah,2 ;回车换行处理
mov dl,0dh
int 21h
mov dl,0ah
int 21h
mov cl,4
mov si,offset data1
mov di,offset data2
mov al,[si+3]
sub al,30h
mov bl,[di+3]
sub bl,30h
mul bl ;逐位相乘
aam ;处理为非压缩BCD码
shl al,cl
shr ax,cl ;变为压缩BCD码
mov dx,ax ;结果放在DX中
mov al,[si+2]
sub al,30h
mul bl
aam
shl al,cl
add al,dl ;与前一次运算结果相加并处理为压缩BCD码
daa
mov dl,al
adc dh,ah
mov al,dh
daa
mov dh,al
mov al,[si+3]
sub al,30h
mov bl,[di+2]
sub bl,30h
mul bl
aam
shl al,cl
add al,dl
daa
mov dl,al
adc dh,ah
mov al,dh
daa
mov dh,al
mov al,[si+2]
sub al,30h
mul bl
aam
shl al,cl
shl ax,cl
add dh,ah
mov al,dh
daa
mov dh,al
mov ch,0 ;CH=0则未开始输出数字
mov cl,4
mov ax,dx ;开始逐位输出结果
push ax
and ah,0f0h
shr ah,cl
mov dl,ah ;将每一位数放在DL
cmp dl,0 ;若为0则不输出
jz two
inc ch
or dl,30h
mov ah,2
int 21h
two: pop ax
push ax
and ah,0fh
mov dl,ah
push dx
add dl,ch
cmp dl,0
pop dx
jz three ;如果未开始输出且为0则不输出
inc ch
or dl,30h
mov ah,2
int 21h
three: pop ax
push ax
and al,0f0h
mov dl,al
shr dl,cl
push dx
add dl,ch
cmp dl,0
pop dx
jz four ;如果未开始输出且为0则不输出
or dl,30h
mov ah,2
int 21h
four: pop ax
and al,0fh
mov dl,al
or dl,30h
mov ah,2
int 21h
mov ah,4ch
int 21h
code ends
end begin
程序运行结果:
实验3:
题目:
—字符匹配程序:从键盘上输入一个字符串,回车结束并回显。用串操作指令设计程序,实现在输入的字符串存储区中寻找空格字符,退出时给出是否找到的信息,并给出具体位置。
流程图:
程序源码:
data segment ;By Xdestiny 04120902 20090956
data1 db 'find it!',0dh,0ah,'$' ;发现
data2 db 'nooooot!',0dh,0ah,'$' ;没发现
input db 30 ;输入的字符串
db ?
db 30 dup(?)
data ends
stack segment stack
db 200 dup(?)
stack ends
extra segment
target db 30 dup(?) ;在附加段中的输入的字符串
extra ends
code segment
assume cs:code,ds:data,es:extra,ss:stack
begin:
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
mov ah,0ah
mov dx,offset input
int 21h
mov bx,offset input
mov si,[bx+1]
and si,00ffh
mov byte ptr[bx+si+2],0dh
inc si
mov byte ptr[bx+si+2],0ah
inc si
mov byte ptr[bx+si+2],'$' ;输入字符串,并加上换行回车
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h ;屏幕上回车换行
mov cx,si
mov di,0
loo1: mov dl,[bx+di+2]
int 21h
inc di
loop loo1 ;输出字符串
mov di,offset target
mov si,offset input
add si,2
mov cx,[bx+1]
and cx,00ffh
add cx,3
push cx
rep movsb ;字符串转移至附加段
pop cx
mov al,20h
mov di,offset target
mov bx,di
mov si,0 ;辅助判断是否需要输出对应信息
loo3: repne scasb ;找空格
jcxz loo2
cmp si,0
jz find
con: push di
sub di,bx
mov dx,di
call dealnum
mov ah,2
mov dl,20h
int 21h
pop di
jmp loo3
final: mov ah,8 ;程序结束
int 21h
mov ah,4ch
int 21h
loo2: cmp si,0 ;输出没找到
jnz final
mov dx,offset data2
mov ah,9
int 21h
jmp final
find: mov dx,offset data1 ;输出找到
mov ah,9
int 21h
inc si
jmp con
dealnum proc ;处理输出数字的过程
push ax
push bx
push cx
and dx,00ffh
mov ax,dx
mov bx,10
div bl
push ax
mov dl,al
or dl,30h
mov ah,2
int 21h
pop ax
mov dl,ah
mov ah,2
or dl,30h
int 21h
pop cx
pop bx
pop ax
ret
dealnum endp
code ends
end begin
程序运行结果:
实验4:
题目:
—冒泡法排序:在自BLOCK开始的存储区内有10个以压缩BCD码存放的无符号数(0~99),试用冒泡法排序,并将排序结果输出显示。
流程图:
程序源码:
data segment
block db 12h,21h,10h,09h,56h,43h,78h,99h,00h,66h
data ends
stack segment stack
db 200 dup (?)
stack ends
code segment
assume cs:code,ds:data
begin:
mov ax,data
mov ds,ax
mov bx,offset block
mov cx,10
mov si,0
loo4: and ax,0 ;输出排序前内存中的数列
mov al,[bx+si]
push cx
mov cl,4
shl ax,cl
shr al,cl
pop cx
mov dl,ah
add dl,30h
mov ah,02h
push ax
int 21h
pop ax
mov dl,al
add dl,30h
int 21h
mov dl,20h
int 21h
inc si
loop loo4
mov bx,offset block
mov cx,10
loo1: push cx ;二重循环进行冒泡排序
mov si,0
dec cx
loo2: mov al,[bx+si]
mov ah,byte ptr[bx+si+1]
cmp al,ah ;比较前后两个数
jna nchg ;大于则交换
mov [bx+si],ah
mov [bx+si+1],al
nchg: inc si
cmp cx,0
jz str
loop loo2
str: pop cx
loop loo1
mov cx,10
mov si,0
loo3: and ax,0 ;输出排序后的数列
mov al,[bx+si]
push cx
mov cl,4
shl ax,cl
shr al,cl
pop cx
mov dl,ah
add dl,30h
mov ah,02h
push ax
int 21h
pop ax
mov dl,al
add dl,30h
int 21h
mov dl,20h
int 21h
inc si
loop loo3
mov ah,01h
int 21h
mov ah,4ch
int 21h
code ends
end begin
程序运行结果:
第二篇:北理工微机原理与接口技术之8255,8253实验报告
微机原理与接口技术
实验报告
———8253可编程定时器
8255并行接口实验
实验一 8255并行接口实验
一, 实验内容
8255的A口作为输入口,与逻辑电平开关相连。8255的B口作为输出口,与发光二极管相连。编写程序,使得逻辑电平开关的变化在发光二极管上显示出来。
二,实验目的
(1)掌握8255的工作原理。
(2)掌握编写8255并行接口初始化及编程实现的方法。
三,实验仪器
微机实验教学系统实验箱、8086CPU模块
四,实验步骤
(1) 连线
w 8255的PA0—PA7分别与逻辑电平开关的K1—K8相连
w PB0—PB7分别与发光二极管电路的LED1—LED8相连
w CS0与8255的片选CS8255相连
w 其它线路均已连好
具体如图所示:
(2) 编辑程序,编译链接后,单步运行,调试程序。
(3) 调试通过后,全速运行,观察实验结果。
(4) 撰写实验报告。
五,实验源程序如下
CODE SEGMENT PUBLIC
ASSUME CS:CODE
ORG 100H
START:
MOV DX,04A6H
MOV AX,90H ;写8255的控制字,A组工作在方式0,A口输入,C口高4位输出,B组工作在方式0,B口及C口的低4位均工作在输出
OUT DX,AX
START1:
MOV DX,04A0H
IN AX,DX ;读取A口数据
MOV DX,04A2H
OUT DX,AX ;将从A口读取的数据从B口输出,控制LED灯
JMP START1
CODE ENDS
END START
六,实验现象
LED灯低电平有效。当某一开关拨到低电平时,对应的LED灯点亮。当某一开关拨到高电平时,对应的LED灯熄灭
七,思考题
1.将片选线接到CS1—CS7;重新编写程序。
CS0对应地址是04A0---O4AF, CS1对应地址是04B0---O4BF.
现将片选线接到CS1,重新编程:
CODE SEGMENT PUBLIC
ASSUME CS:CODE
ORG 100H
START:
MOV DX,04B6H ;CS1对应的地址
MOV AX,90H
OUT DX,AX
START1:
MOV DX,04B0H
IN AX,DX
MOV DX,04B2H
OUT DX,AX
JMP START1
CODE ENDS
END START
实验现象:如同片选线接到CS0
2.交换A ßà B接线,A口输出、B口输入;重新编写程序。
PB0—PB7分别与逻辑电平开关的K1—K8相连
PA0—PA7分别与发光二极管电路的LED1—LED8相连
CODE SEGMENT PUBLIC
ASSUME CS:CODE
ORG 100H
START:
MOV DX,04B6H ;片选线接到CS1
MOV AX,82H
OUT DX,AX ;写控制字,A,B组均工作在方式0,A口输出,B口输入
START1:
MOV DX,04B2H
IN AX,DX ;读取B口数据
MOV DX,04B0H
OUT DX,AX ;将B口的数据从A口输入,控制LED灯
JMP START1
CODE ENDS
END START
实验现象:
LED灯低电平有效。当某一开关拨到低电平时,对应的LED灯点亮。当某一开关拨到高电平时,对应的LED灯熄灭
3.C口4位接LED;4位接开关;重新编写程序。
PC4—PC7分别与逻辑电平开关的K1—K4相连
PC0—PC3分别与发光二极管电路的LED1—LED4相连
CODE SEGMENT PUBLIC
ASSUME CS:CODE
ORG 100H
START:
MOV DX,04B6H ;片选接CS1
MOV AX,88H
OUT DX,AX ;A,B组均工作在方式0,C口高4位输入,低4位输出
START1:
MOV DX,04B4H
IN AL,DX ;读取C口数据
MOV CL,4
ROR AL,CL ;不带CF位的循环右移4位,使C口数据的高4位与低4位互换
MOV DX,04B4H
OUT DX,AL ;将C口高4位的数据从低4位输出,控制LED灯
JMP START1
CODE ENDS
END START
实验现象: LED灯低电平有效。当某一开关拨到低电平时,对应的LED灯点亮。当某一开关拨到高电平时,对应的LED灯熄灭
八,实验心得
通过8255并行接口实验,我对8255有了更深刻地了解,对其在内存中的地址,各寄存器的使用有了较为清晰的认识。通过思考题的练习,掌握了8255的编程原理。软硬件的结合,使我们学以致用,能力有了较大提升。
实验二 8253可编程定时器
一,实验内容
8253计数器0,1,2工作于方波方式,观察其输出。
二,实验目的
掌握8253定时/计数器的编程原理。
三,实验设备
微机实验教学系统实验箱、8086CPU模块。
四,实验步骤
(1) 连线
u CS0与8253的片选CS8253相连;
u CLK3(750KHz)与8253CLK0相连;
u 8253的OUT0与8253CLK2相连;
u OUT2与发光二极管LED1相连;
u 其它线均已连好。
(2) 编辑程序,编译链接后,跟踪运行,调试程序。
(3) 调试通过后,全速运行,观察实验结果。
(4) 撰写实验报告。
五,实验源程序
CODE SEGMENT PUBLIC
ASSUME CS:CODE
ORG 100H
START:
MOV DX,04A6H
MOV AX,36H
OUT DX,AX ;写控制字,计数器0工作在方式3,先读写计数器低8位,再读写计数器高8位,二进制计数
MOV DX,04A0H
MOV AX,7CH
OUT DX,AX
MOV AX,92H
OUT DX,AX ;将计数初值927CH写入计数器0
MOV DX,04A6H
MOV AX,0B6H
OUT DX,AX ;写控制字,计数器2工作在方式3,先读写计数器低8位,再读写高8位,二进制计数
MOV DX,04A4H
MOV AX,4
OUT DX,AX
MOV AX,0
OUT DX,AX ;将计数初值4H写入计数器2
JMP $ ;原地跳转,等待
CODE ENDS
END START
六,实验现象
LED1灯交替亮灭(闪烁),且亮灭时间相等
七,思考题
1.定时器2计数值改为20H;观察其现象。
CODE SEGMENT PUBLIC
ASSUME CS:CODE
ORG 100H
START:
MOV DX,04A6H
MOV AX,36H
OUT DX,AX
MOV DX,04A0H
MOV AX,7CH
OUT DX,AX
MOV AX,92H
OUT DX,AX
MOV DX,04A6H
MOV AX,096H
OUT DX,AX ;写控制字,计数器2工作在方式3,只写计数器低8位,二进制计数
MOV DX,04A4H
MOV AX,20H
OUT DX,AX ;将计数初值20H写入计数器2
JMP $
CODE ENDS
END START
实验现象:LED1灯等时间间隔的交替两灭,但亮灭的周期更长,即灯闪烁得更慢
2.将定时器2改为方式2分频器方式;观察其现象。
CODE SEGMENT PUBLIC
ASSUME CS:CODE
ORG 100H
START:
MOV DX,04A6H
MOV AX,36H
OUT DX,AX
MOV DX,04A0H
MOV AX,7CH
OUT DX,AX
MOV AX,92H
OUT DX,AX
MOV DX,04A6H;写控制字,计数器2工作在方式2,只写计数器低8位,二进制计数
MOV AX,094H
OUT DX,AX
MOV DX,04A4H
MOV AX,20H
OUT DX,AX
JMP $
CODE ENDS
END START
实验现象:LED1灯亮的时间变长,灭的时间变短
3.将 GATE2 接到开关上;观察其现象。
用上面思考题2的程序,把GATE2 接到开关K1上。当打开开关(开关置1)时,实验现象同思考题2;当开关关闭时,LED1灯始终灭。
4. 将 GATE2 接到 PUL P0开关上,计数器 2 改为方式 1 ;观察其现象。
GATE2接到PUL P0开关的P+端口
CODE SEGMENT PUBLIC
ASSUME CS:CODE
ORG 100H
START:
MOV DX,04A6H
MOV AX,36H
OUT DX,AX
MOV DX,04A0H
MOV AX,7CH
OUT DX,AX
MOV AX,92H
OUT DX,AX
MOV DX,04A6H;写控制字,计数器2工作在方式1,只写计数器低8位,二进制计数
MOV AX,092H
OUT DX,AX
MOV DX,04A4H
MOV AX,20H
OUT DX,AX
JMP $
CODE ENDS
END START
实验现象:按一下PUL P0开关,LED1灯亮,但几秒后就会熄灭。这时,再按动PUL P0开关,LED1灯亮,几秒后又会灭,亮灭情况同第一次相同。每次当灯熄灭后,按动PUL P0开关,LED1灯会产生同第一次相同的亮灭情况。每次在灯未熄灭时,按动PUL P0开关,则灯亮的时间变长,对应示波器的低电平时间加长。
5. 将 GATE2 接到 PUL P0开关上,计数器 2 改为方式 5 ;观察其现象。
GATE2接到PUL P0开关的P+端口
CODE SEGMENT PUBLIC
ASSUME CS:CODE
ORG 100H
START:
MOV DX,04A6H
MOV AX,36H
OUT DX,AX
MOV DX,04A0H
MOV AX,7CH
OUT DX,AX
MOV AX,92H
OUT DX,AX
MOV DX,04A6H;写控制字,计数器2工作在方式5,只写计数器低8位,二进制计数
MOV AX,09AH
OUT DX,AX
MOV DX,04A4H
MOV AX,20H
OUT DX,AX
JMP $
CODE ENDS
END START
实验现象:触发PUL P0开关后一段时间LED1灯闪一下,然后就立即熄灭,示波器低电平极短
八,实验遇到的问题及实验心得
实验还算顺利,没有遇到什么问题。
本次实验,收获颇多,更形象地熟悉了8253定时计数器的6种工作方式的使用及其特点,包括每种方式的控制字、启动方式、输出波形的特点等。通过动手接硬件电路,熟练了实验箱的使用,而且用示波器和LED灯观察实验现象,方便直观。