如何在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
关键修改点说明
- 替换阻塞输入为非阻塞检查:在自动模式延迟后,先用
AH=0Bh检查按键,避免程序卡住 - 完善按键处理逻辑:自动模式下检测到按键后,根据输入跳转到对应模式,而非直接回到初始状态
- 添加正常退出指令:在
endd标签中加入int 21h AH=4Ch,确保程序能正确结束
内容的提问来源于stack exchange,提问作者Tuan Anh
相关产品推荐
相关产品推荐

