如何在GDB中直接设置浮点寄存器的RAW原始字节值(含NAN/INF场景)
GDB设置特殊浮点寄存器值的解决方案
核心通用方法
你提到的(void*)强转语法可以直接实现原始字节写入,配合类型指定可以覆盖所有单/双精度特殊浮点值的设置需求:
- 64位双精度浮点寄存器直接用
set (void*)$fN = <原始64位十六进制值>即可写入 - 32位单精度浮点寄存器使用
set {float}&$fN = <原始32位十六进制值>写入
所有特殊值对应设置指令(将$fN替换为你要操作的寄存器编号即可)
双精度(64位)
- 正pynan:
set (void*)$fN = 0x7FFFC00000000000 - 负pynan:
set (void*)$fN = 0xFFFC000000000000 - 正qnan:
set (void*)$fN = 0x7FFFC00000000001 - 负qnan:
set (void*)$fN = 0xFFFC000000000001 - 正snan:
set (void*)$fN = 0x7FFF800000000001 - 负snan:
set (void*)$fN = 0xFFF8000000000001 - 正inf:
set (void*)$fN = 0x7FF0000000000000 - 负inf:
set (void*)$fN = 0xFFF0000000000000 - 负零:
set (void*)$fN = 0x8000000000000000
单精度(32位)
- 正pynan:
set {float}&$fN = 0x7FC00000 - 负pynan:
set {float}&$fN = 0xFFC00000 - 正qnan:
set {float}&$fN = 0x7FC00001 - 负qnan:
set {float}&$fN = 0xFFC00001 - 正snan:
set {float}&$fN = 0x7F800001 - 负snan:
set {float}&$fN = 0xFF800001 - 正inf:
set {float}&$fN = 0x7F800000 - 负inf:
set {float}&$fN = 0xFF800000 - 负零:
set {float}&$fN = 0x80000000
设置完成后执行info reg $fN即可通过输出的raw字段验证写入的原始字节是否正确。如果是x86等使用xmm/ymm等别名浮点寄存器的架构,替换指令中的$fN为对应寄存器名即可通用。
内容的提问来源于stack exchange,提问作者lockecoleff
相关产品推荐
相关产品推荐

