【问题标题】:How to print/examine floating point registers?如何打印/检查浮点寄存器?
【发布时间】:2020-09-01 04:22:24
【问题描述】:

假设我有以下内容:

c: .float 3.14
movss c(%rip), %xmm0

如何以可读的方式检查该寄存器?例如,我可以获得整个调试输出,而不仅仅是一个友好的数字:

>>> p/f $xmm0
$2 = {
  v4_float = {[0] = 3.1400001, [1.40129846e-45] = 0, [2.80259693e-45] = 0, [4.20389539e-45] = 0},
  v2_double = {[0] = 5.3286132608536752e-315, [1.40129846e-45] = 0},
  v16_int8 = {[0] = -61, [1.40129846e-45] = -11, [2.80259693e-45] = 72, [4.20389539e-45] = 64, [5.60519386e-45] = 0 <repeats 12 times>},
  v8_int16 = {[0] = -2621, [1.40129846e-45] = 16456, [2.80259693e-45] = 0, [4.20389539e-45] = 0, [5.60519386e-45] = 0, [7.00649232e-45] = 0, [8.40779079e-45] = 0, [9.80908925e-45] = 0},
  v4_int32 = {[0] = 3.1400001, [1.40129846e-45] = 0, [2.80259693e-45] = 0, [4.20389539e-45] = 0},
  v2_int64 = {[0] = 5.3286132608536752e-315, [1.40129846e-45] = 0},
  uint128 = 3.93143274128552720884e-4942
}

在没有其他所有输出行的情况下,我如何才能获得 3.14 的值?

希望我可以通过检查变量本身获得类似的结果:

>>> x/f &c
0x6000df:   3.1400001

【问题讨论】:

    标签: c assembly gdb sse


    【解决方案1】:

    您可以使用点表示法来打印特定项目。例如,要打印 floatdouble 值:

    >>> p $xmm0.v4_float[0]
    $4 = 3.1400001
    >>> p $xmm0.v2_double[0]
    $5 = 5.3286132608536752e-315
    

    显然double 在这里毫无意义,但用于表明v4_floatv2_doublev16_int8 中的任何一个都应该有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 2011-07-22
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多