x86 的未定义指令为什么叫 ud2?那个 2 从哪来
来源:devblogs.microsoft.com — devblogs.microsoft.com · 71 分 · by ibobev
📋 概述
Raymond Chen 解答一个汇编层面的小疑惑:为什么未定义指令叫 ud2 而不是 ud。ud2 是一条架构上合法的指令,保证触发「非法操作码」异常,编译器常把它放在 [[noreturn]] 函数之后,一旦控制流意外落到那里就崩掉,而不是继续执行随机指令——他在排查某个软件挂钩 API 导致的崩溃时就看到了它。文章顺便回顾了历史:早年确实存在过 ud1,后来 Intel 手册把它重新定义为一条真实的 SSE 指令,于是「未定义」的槽位只留下了 2 号,名字也就固定成了 ud2。
🔑 核心要点
- ud2 保证触发非法操作码异常,是架构上合法的陷阱指令。
- 编译器用它标记 [[noreturn]] 之后 等不可达位置,防止执行随机指令。
- 历史上确实存在 ud1,它后来被重新定义为真实指令。
- 「未定义」槽位只剩 2 号,因此名字 固定为 ud2。
- 它的实用价值是让意外落空的控制流立刻崩掉,便于定位问题。
💡 金句
它不是「第二条未定义指令」,而是唯一活下来的那一条未定义指令。
👍 0
👎 0
← 返回 Hacker News 首页