8088单板机监控程序解读(三)
·
TF=1 触发INT1中断后 TF值是多少 会不断触发单步运行吗?
答案是:不会无限触发。
当 INT 1 中断被响应时,CPU 硬件会自动清除 TF 标志(将 TF 设为 0)。
原因分析:CPU 的中断响应机制
在 8086 中,当 CPU 响应任何中断(包括 INT 1, INT 3, 硬件中断等)时,硬件会自动执行以下操作:
-
将
FLAGS寄存器压入堆栈 -
清除
TF标志(设为 0)—— 这是硬件自动完成的 -
清除
IF标志(设为 0),屏蔽其他可屏蔽中断 -
将
CS压入堆栈 -
将
IP压入堆栈 -
从中断向量表读取新的
CS:IP
为什么 CPU 要清除 TF?
这是为了防止中断处理程序本身也被单步中断。
想象一下如果不清除 TF:
用户程序 → 执行一条指令 → TF=1 触发 INT 1
进入中断处理程序(SERVICE_BREAK)
执行 SERVICE_BREAK 的第一条指令 → TF 仍为 1 → 又触发 INT 1
→ 无限循环,永远无法正常执行中断服务程序
你的程序中的验证
在 SERVICE_BREAK 中(源码第 1333-1334 行):
C742 58 POP AX
C743 A304FF MOV [USER_FLAG],AX ; 保存的是进入中断前的 FLAGS
这里保存的 USER_FLAG 中 TF 位是 1(因为是执行用户指令后触发的中断)。
但 SERVICE_BREAK 本身执行时的 FLAGS 寄存器中,TF 已经被硬件清除了。你可以验证:如果在 SERVICE_BREAK 中读取 FLAGS(比如用 PUSHF + POP AX),会看到 TF=0。
单步执行的完整流程
| 步骤 | 状态 | TF 值 |
|---|---|---|
1. KEY_STEP 执行 IRET |
设置用户 FLAGS 中的 TF=1 | (在栈中为 1) |
| 2. CPU 执行用户程序第一条指令 | 执行过程中 | 1 |
| 3. 用户指令执行完毕,CPU 检查 TF | TF=1,触发 INT 1 |
1 |
| 4. CPU 响应中断,自动清除 TF | 压栈原 FLAGS(TF=1),然后清除 TF | 0 |
5. 进入 SERVICE_BREAK |
执行中断服务程序 | 0 |
6. SERVICE_BREAK 保存寄存器、返回监控 |
不会再次触发单步 | 0 |
更多推荐

所有评论(0)