stack segment
db 64 dup(?)
stack ends
data segment
ioport equ
0ff00h - 0280h
io8255a equ
ioport + 288h
io8255b equ
ioport + 289h
io8255c equ
ioport + 28ah
io8255d equ
ioport + 28bh
portc1 db
24h, 44h, 04h, 44h, 04h, 44h, 04h,
db
81h, 82h, 80h, 82h, 80h, 82h, 80h
db
0ffh
data ends
code segment
assume cs:code, ds:data
start:
mov
ax, data
mov
ds, ax
;设置数据段
mov ax,stack
;设置堆栈段为
mov ss,ax
;第二种循环显示方法
mov sp,64
;保存循环次数
mov
dx, io8255d
mov
al, 90h
;设置控制命令,10010000b
out
dx, al
;将控制命令字写入io8255d中
lea
di, portc1
;把protcl的数据基址放入di
mov bx,3
;设置第二种显示方法的循环初值
push bx
;在栈中保存
re_on:
mov
al, [di]
;取当前di指向地址中的内容
inc
di
;di指针后移
cmp
al, 0ffh
;判断al中取到的值是否是0ffh
jz
x
;如果是,跳转到x
mov
dx, io8255c
on:
out
dx, al
;向io8255c中写入显示模式
call
delay
;延时显示
jmp
re_on
;跳转到re_on继续
exit:
mov
ah, 4ch
int
21h
;结束
delay proc near
;定义延时函数
mov
cx, 5300h
de1:
mov
bx, 0fff0h
de0:
dec bx
jnz
de0
loop de1
;做5300h*0fff0h次的循环
ret
delay endp
x: pop bx
;取出在栈中保存的循环次数
dec bx
;循环次数减一
push bx
;保存循环次数
cmp bx,0
;判断是否已经循环3次
jz exit
;已经循环3次则退出
lea di,portc1
;否则再次从portcl起始拿数值
jmp RE_ON
;跳转re_on继续
code ends
end start