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

如何在emu8086中禁用INT 21h?交通灯程序模式切换遇阻塞

解决8086交通灯程序自动模式下的输入阻塞问题

问题根源

你的代码在自动模式的延迟循环后,使用了int 21h AH=01h调用——这个功能会阻塞程序直到用户按下按键,导致自动模式无法正常循环切换交通灯,必须等待输入才能继续执行。

修复方案

使用int 21h AH=0Bh进行非阻塞式键盘检查,这个调用不会等待输入,仅返回当前是否有按键按下:

  • 若有按键,AL=0FFh,此时再用AH=01h读取按键值
  • 若无按键,AL=00h,程序继续执行自动模式的灯切换逻辑

同时调整自动模式的按键处理逻辑,让程序能根据输入切换到对应模式,而非直接跳回初始状态。

修改后的完整代码

#start=Traffic_Lights.exe#

name "traffic"

data segment
    mes db 'Press 1 for all red, 2 or 3 for manual mode, 4 for auto mode, 5 to stop the program $'
    buffer db 10, 0
    timeout db 0
             
;                FEDC_BA98_7654_3210
situation dw 0000_0011_0000_1100b
s1        dw 0000_0010_1000_1010b
s2        dw 0000_1000_0110_0001b
s3        dw 0000_1000_0110_0001b
s4        dw 0000_0100_0101_0001b    

sit_end = $
;            FEDC_BA98_7654_3210
all_red  equ 0000_0010_0100_1001b
all_off  equ 0000_0000_0000_0000b
s5        dw 0000_1000_0110_0001b
s6        dw 0000_0011_0000_1100b
s7        dw 0000_0100_1001_0010b
data ends

code segment
    assume cs:code, ds:data

start:
    mov ax, @data
    mov ds, ax 

    lea dx, mes
    mov ah, 9
    int 21h       

    mov ax, all_off
    out 4, ax

    mov ax, all_red
    out 4, ax

input:
    mov ah, 01h    ; 阻塞式读取按键
    int 21h        
    ; 手动模式处理
    cmp al, '0'
    je turn_off_lights
    
    cmp al, '1'
    je turn_on_red_lights 
    
    cmp al, '2'
    je turn_on_x_axis_lights

    cmp al, '3'
    je turn_on_y_axis_lights

    cmp al,'4'
    je automatic_mode
    
    cmp al, '5'
    je endd

    jmp input      ; 重复输入直到有效按键

turn_off_lights:
    mov ax, all_off
    out 4, ax
    jmp input

automatic_mode:
    mov si, offset situation

next_situation:
    mov ax, [si]
    out 4, ax
    
DELAY_LOOP:
    ; 5秒延迟
    mov cx, 4Ch    
    mov dx, 4B40h
    mov ah, 86h
    int 15h
    
    ; 非阻塞检查是否有按键
    mov ah, 0Bh
    int 21h
    cmp al, 00h
    je no_key_pressed  ; 无按键,继续自动模式
    
    ; 有按键,读取按键值
    mov ah, 01h
    int 21h
    ; 处理按键
    cmp al, '5'
    je endd          ; 退出程序
    cmp al, '1'
    je turn_on_red_lights  ; 切换到全红
    cmp al, '2'
    je turn_on_x_axis_lights  ; X轴模式
    cmp al, '3'
    je turn_on_y_axis_lights  ; Y轴模式
    cmp al, '4'
    je automatic_mode  ; 保持自动模式
    
no_key_pressed:
    add si, 2
    cmp si, sit_end
    jb next_situation
    mov si, offset situation
    jmp next_situation

turn_on_red_lights:
    mov ax, all_red
    out 4, ax
    jmp input

turn_on_x_axis_lights:
    mov ax, s1
    out 4, ax

    mov cx, 4Ch    
    mov dx, 4B40h
    mov ah, 86h
    int 15h

    mov ax, s5
    out 4, ax
    jmp input

turn_on_y_axis_lights:
    mov ax, s4
    out 4, ax

    mov cx, 4Ch    
    mov dx, 4B40h
    mov ah, 86h
    int 15h

    mov ax, s6
    out 4, ax
    jmp input

endd:
    mov ax, all_off
    out 4, ax
    mov ah, 4Ch
    int 21h  ; 正常退出程序
code ends
end start

关键修改点说明

  1. 替换阻塞输入为非阻塞检查:在自动模式延迟后,先用AH=0Bh检查按键,避免程序卡住
  2. 完善按键处理逻辑:自动模式下检测到按键后,根据输入跳转到对应模式,而非直接回到初始状态
  3. 添加正常退出指令:在endd标签中加入int 21h AH=4Ch,确保程序能正确结束

内容的提问来源于stack exchange,提问作者Tuan Anh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:00:22