1.指令

2.生成的代码

; 8259中断控制LED亮灭反转程序
; 端口定义: 8259 - 400H(命令),402H(数据); LED - 800H
; 中断设置: IR0中断类型码为20H

ORG 100H            ; COM文件起始地址
JMP INIT            ; 跳转到初始化程序

; 数据段
LED_STATE DB 0FFH   ; LED初始状态(全亮)
INT_MASK DB ?       ; 保存原始中断屏蔽字

; 中断服务程序(IR0)
ISR PROC FAR
    PUSH AX         ; 保存寄存器
    PUSH DX
    
    ; LED状态反转
    MOV AL, [LED_STATE]
    NOT AL
    MOV [LED_STATE], AL
    
    ; 输出到LED端口
    MOV DX, 800H
    OUT DX, AL
    
    ; 发送EOI命令(结束中断)
    MOV DX, 400H
    MOV AL, 20H     ; OCW2: 非特殊EOI命令
    OUT DX, AL
    
    POP DX          ; 恢复寄存器
    POP AX
    IRET            ; 中断返回
ISR ENDP

; 初始化程序
INIT:
    CLI             ; 关中断
    
    ; 设置中断向量(中断号20H)
    MOV AX, 0
    MOV ES, AX
    MOV DI, 20H * 4    ; 中断向量表地址
    MOV AX, OFFSET ISR ; 设置偏移地址
    CLD
    STOSW
    MOV AX, CS         ; 设置段地址
    STOSW
    
    ; 初始化8259
    MOV DX, 400H       ; ICW1: 边沿触发, 级联, 需要ICW4
    MOV AL, 00010011B  ; 13H
    OUT DX, AL
    
    MOV DX, 402H       ; ICW2: 设置中断向量基值20H
    MOV AL, 20H
    OUT DX, AL
    
    MOV AL, 00000001B  ; ICW4: 8086模式, 非缓冲, 正常EOI
    OUT DX, AL
    
    ; 保存并设置中断屏蔽字(只允许IR0)
    MOV AL, 11111110B  ; 只开启IR0
    OUT DX, AL
    MOV [INT_MASK], AL
    
    ; 初始LED状态
    MOV DX, 800H
    MOV AL, [LED_STATE]
    OUT DX, AL
    
    STI             ; 开中断

; 主循环(等待中断)
MAIN_LOOP:
    HLT             ; 暂停CPU等待中断
    JMP MAIN_LOOP

END INIT           ; 程序结束点

3.加一句单板机需要的结束标志,即可编译现在运行,运行正确

 

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐