欢迎光临
我们一直在努力

8088单板机监控程序解读(五)

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 继续执行。

    赞(0)
    未经允许不得转载:171主机测评 » 8088单板机监控程序解读(五)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址