汇编代码及解释如下:
.MODEL TINY
.STACK 100
.DATA
.CODE
start:
; set segment registers:
mov bl,0feh ;先将bl通用寄存器的值置为1111 1110(实验室的实验箱中电路没有设置反相器,故设为7个1,1个0)
mov dx,273h ;将273h送入地址寄存器dx,根据课本P169中8255A的端口操作表,由于273h中3对应0011,故A1A0=11,对应数据总线->控制寄存器,即为写入控制字做准备
mov al,10000010b ;将1000 0010写入al通用寄存器中
out dx,al ;将1000 0010设为8255A的控制字,根据课本P171中8255A的方式选择控制字可知D7...D1D0=1...10,故B口输入C口输出(以上四行为8255A的初始化程序)
go: mov al,0ffh ;初始化al通用寄存器,初始化其值为1111 1111
mov dx,272h ;将272h送入地址寄存器dx,根据课本P169中8255A的端口操作表,由于272h中2对应0010,故A1A0=10,对应C口
out dx,al ;将al中的数据写入dx对应端口(即将al中数据写入C口)
mov dx,271h ;将271h送入地址寄存器dx,根据课本P169中8255A的端口操作表,由于271h中1对应0010,故A1A0=01,对应B口
in al,dx ;将al中的数据读入dx对应端口(即将al中数据读入B口)
and al,0fh ;对al寄存器中的8位值进行and(与)运算,只取后4位
cmp al,0eh ;cmp比较al中的值和0e,若相等,则zf标志位为1,执行jz指令
jz st1
cmp al,0dh
jz nd1
cmp al,0bh
jz rd1
cmp al,07h
jz th1
jmp go
st1: mov bl,0feh
mov dx,272h
mov al,00h
out dx,al
jmp go
nd1: mov bl,0feh
mov dx,272h
mov al,0ffh
out dx,al
jmp go
rd1: mov dx,272h
mov al,bl
out dx,al
rol bl,1 ;rol中的l代表left,rol为循环左移指令,移位后经过ffff次loop再次jmp到go段重新执行,下同
mov cx,0ffffh
lo1:loop lo1
jmp go
th1: mov dx,272h
mov al,bl
out dx,al
ror bl,1
mov cx,0ffffh
lo2:loop lo2
jmp go
end start