You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:54:03