Digamos que tengo lo siguiente:

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

¿Cómo puedo examinar ese registro de manera legible? Por ejemplo, puedo obtener toda la salida de depuración, pero no solo un número descriptivo:

>>> 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
}

¿Cómo obtendría el valor 3.14 sin todas las demás líneas de salida?

Con suerte, algo como puedo obtener al examinar la variable en sí:

>>> x/f &c
0x6000df:   3.1400001
1
David542 1 sep. 2020 a las 07:22

1 respuesta

La mejor respuesta

Puede utilizar la notación de puntos para imprimir los elementos específicos. Por ejemplo, para imprimir el valor float y double:

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

Obviamente, double no tiene sentido aquí, pero se usa para mostrar que cualquiera de v4_float, v2_double, v16_int8, ... debería funcionar.

4
David542 1 sep. 2020 a las 04:35