x86汇编下8255芯片开关控制程序JZ/JNZ异常跳转问题咨询
问题原因
- 8255的B口为8位输入端口,你仅连接了2个开关,剩余6个输入引脚未做上下拉处理处于悬空状态,悬空的数字输入引脚默认读取值为高电平。若你的2个开关默认处于断开状态(对应输入高电平),程序首次读取B口得到的
al值就是0xFF,执行cmp al,0FFH时ZF标志位被置1,直接触发JZ AB跳转退出,就是你遇到的异常跳转现象。 - 你的判断逻辑存在设计漏洞:仅用到2位开关的输入值,却对整个8位的
al寄存器做全0/全1判断,未接开关的6位值会直接干扰判断结果,哪怕你拨动开关,也很难得到符合预期的0H或0FFH值。
修复方案
先对读取到的B口值做掩码处理,屏蔽未接开关的无效位,再做判断即可。假设你接的是B口最低2位,修改后的代码如下:
CODES SEGMENT ASSUME CS:CODES START: mov al,10000010b ; 设置为控制字,A口方式0输出,B口方式0输入 mov dx,41bh;41bh为控制寄存器的地址 out dx,al;将控制字送入到控制寄存器中,完成芯片的初始化操作 L1: mov dx,419h;419h为B口的地址 in al,dx;从B口读入开关的状态 and al,03H ; 新增:屏蔽高6位无效值,仅保留接了开关的低2位 mov dx,418h;418h为A口的地址 out dx,al;将有效位输出到A口,控制灯的亮灭 cmp al,0H JZ AB cmp al,03H ; 将原0FFH修改为有效位全1的值 JZ AB jmp L1 AB: MOV AH,4CH INT 21H CODES ENDS END START
如果你的开关接的是B口其他引脚,只需将and al,03H中的03H替换为对应有效位为1的掩码,同时将cmp al,03H中的03H替换为对应掩码即可。
内容的提问来源于stack exchange,提问作者hefengcs
相关产品推荐
相关产品推荐

