8088kit用户手册资源-CSDN下载
触发 SERVICE_BREAK 的两种途径
1. 通过 INT 3 断点指令触发
这是最常见的使用方式。用户在程序中插入 INT 3 指令(机器码 CCH),当 CPU 执行到该指令时:
CPU 硬件自动完成:
将 FLAGS 寄存器压入堆栈
将 CS 压入堆栈
将 IP 压入堆栈
从中断向量表 0000CH 读取中断服务程序地址
跳转到该地址执行
向量表设置(源码第 144-149 行):
144 ; INSERT VECTOR FOR INT 3 INSTRUCTION
146 C036 B81CC7 MOV AX,SERVICE_BREAK ; IP = C71C
147 C039 A30C00 MOV [000CH],AX ; 写入向量表偏移量
148 C03C B800F0 MOV AX,0F000H ; CS = F000
149 C03F A30E00 MOV [000EH],AX ; 写入向量表段地址
所以 INT 3 触发后,CPU 会跳转到 F000:C71C,即 SERVICE_BREAK。
2. 通过单步陷阱(INT 1)触发
当用户按 STEP 键单步执行时,监控程序会设置 CPU 的陷阱标志(TF):
KEY_STEP 函数设置陷阱标志(源码第 559-602 行):
559 C2B3 KEY_STEP
564 C2BD 9C PUSHF ; 压入当前 FLAGS
565 C2BE 8BEC MOV BP,SP
566 C2C0 814E000001 OR WORD PTR[BP+0],0100H ; 设置 TF 位(位 8)
…
602 C2F0 CF IRET ; 恢复 FLAGS(TF 被设置)
当 TF=1 时,CPU 在每条指令执行后自动触发 INT 1 中断。
向量表设置(源码第 151-156 行):
151 ; INSERT VECTOR FOR INT 1 TRAP
153 C042 B81CC7 MOV AX,SERVICE_BREAK ; IP = C71C
154 C045 A30400 MOV [0004H],AX ; 写入向量表偏移量
155 C048 B800F0 MOV AX,0F000H ; CS = F000
156 C04B A30600 MOV [0006H],AX ; 写入向量表段地址
所以 INT 1 触发后,同样跳转到 F000:C71C,即 SERVICE_BREAK。
触发流程示意图
用户程序执行
│
├── 遇到 INT 3 指令 (CCH)
│ │
│ ▼
│ CPU 硬件自动:
│ 1. 压入 FLAGS
│ 2. 压入 CS
│ 3. 压入 IP
│ 4. 查向量表 0000CH → F000:C71C
│ │
│ ▼
└── 单步执行(TF=1)完成一条指令后
│
▼
CPU 硬件自动:
1. 压入 FLAGS
2. 压入 CS
3. 压入 IP
4. 查向量表 00004H → F000:C71C
│
▼
SERVICE_BREAK 函数执行
SERVICE_BREAK 执行流程(源码第 1316-1341 行)
1316 C71C SERVICE_BREAK
1318 C71C A312FF MOV [USER_AX],AX ; ① 保存所有寄存器到变量区
1319 C71F 891E14FF MOV [USER_BX],BX
1320 C723 890E16FF MOV [USER_CX],CX
1321 C727 891618FF MOV [USER_DX],DX
1322 C72B 892E1AFF MOV [USER_BP],BP
1324 C72F 89361CFF MOV [USER_SI],SI
1325 C733 893E1EFF MOV [USER_DI],DI
1327 C737 58 POP AX ; ② 弹出 CPU 压入的 IP
1328 C738 A306FF MOV [USER_IP],AX ; 保存到 USER_IP
1329 C73B A33CFF MOV [CURRENTAD],AX ; 同时作为当前显示地址
1331 C73E 58 POP AX ; ③ 弹出 CPU 压入的 CS
1332 C73F A308FF MOV [USER_CS],AX ; 保存到 USER_CS
1333 C742 58 POP AX ; ④ 弹出 CPU 压入的 FLAGS
1334 C743 A304FF MOV [USER_FLAG],AX ; 保存到 USER_FLAG
1335 C746 892610FF MOV [USER_SP],SP ; ⑤ 保存用户栈指针
1337 C74A E84EFE CALL READ_MEMORY ; ⑥ 刷新 7 段数码管显示
1339 C74D 8B2640FF MOV SP,[SAVE_SYSTEM_STACK] ; ⑦ 切换回监控程序的系统栈
1341 C751 C3 RET ; ⑧ 返回到监控程序主循环
总结
| INT 3 指令 | 软件中断 | 0000CH | 用户程序主动执行 CCH 指令 |
| 单步陷阱 | 硬件中断 | 00004H | 用户按 STEP 键,TF=1,每条指令后触发 |
两种方式最终都调用 SERVICE_BREAK,它保存 CPU 状态后返回到监控程序,让用户可以通过 REG 键查看寄存器内容,或通过 GO/STEP 继续执行。




