(一) 操作练习
通过8253芯片通道0和通道2级连,CLK0输入时钟信号100KHz,使OUT2每隔1s,通过不可屏蔽引脚NMI产生中断,依次轮流点亮8盏LED灯。
DATA SEGMENT
LIGHT_STATUS DB 00000001B
DATA ENDS
CODE SEGMENT 'CODE'
ASSUME CS:CODE,DS:DATA
BEGIN:
MOV AX,DATA
MOV DS,AX
MOV AX,0
MOV DS,AX
MOV SI,02H*4 ;设置2号中断向量
MOV AX,OFFSET NMI_SERVICE
MOV [SI],AX
MOV AX,SEG NMI_SERVICE
MOV [SI+2],AX
MOV DX,406H
MOV AL, 16H ;计数器0,只读写低字节,方式3,二进制
OUT DX,AL
MOV DX,400H
MOV AL,11001000B ;十进制200
OUT DX,AL
MOV DX,406H
MOV AL, 0B0H ;计数器2,先读写低字节后读写高字节,方式0,二进制
OUT DX,AL
MOV DX,404H
MOV AX,000111110100B ;十进制500
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX 200H ;灯的地址
MOV AL,LIGHT_STATUS ;点亮第一个LED灯
OUT DX,AL
JMP $ ;等待中断
MOV AH,4CH
INT 21H
NMI_SERVICE PROC FAR
MOV DX, 200H ;灯的地址
MOV AL,LIGHT_STATUS
ROL AL,1 ;灯循坏左移一位
OUT DX,AL
MOV LIGHT_STATUS,AL ;更新LIGHT_STATUS的值
MOV DX,406H ;通道2送计数初值,再次启动计数
MOV AL, 0B0H ;计数器2,先读写低字节后读写高字节,方式0,二进制
OUT DX,AL
MOV DX,404H
MOV AX,000111110100B ;十进制500
OUT DX,AL
MOV AL,AH
OUT DX,AL
IRET
NMI_SERVICE ENDP
CODE ENDS
END BEGIN
仿真结果(截图放在下面):
-
请回答:程序中的400H、404H、406H分别表示哪个端口的地址?
400H代表计数器0
404H代表计数器2
406H代表控制端口 -
请回答:下面这两行代码是什么意思?
MOV AH,4CH
INT 21H
INT表示中断
代码表示执行中断指令4CH -
请回答:图中红框里面的三行代码是什么意思?(给这三行代码添加注释)
将AL的内容输出到DX所指示的端口
将ax寄存器高八位赋值给低八位
将AL的内容输出到DX所指示的端口 -
请回答:为什么计数器0的计数初值是200,计数器2的计数初值是500?
计数器0初值是200, 计数器2初值是500
芯片通道0和通道2级联,两个计数器初值乘积为100k
- 请回答:如果将计数器0的计数初值改为250,计数器2的计数初值改为400,仿真效果一样吗?在程序中的哪个位置进行修改,请将修改的地方截图,并在图中标记出来?
仿真效果一样的