gdb:打印AArch64高级SIMD矢量寄存器(有可能吗?)

问题描述:

我正在尝试在我的汇编代码内部进行调试,以检查高级SIMD矢量寄存器中的值。为此,我运行gdb并在我的指令中设置一个断点,运行layout asm并使用si按照我的指示执行。然而,当我达到我想要的指令,对v16例如,没有打印该寄存器中的值,它给了我这样的错误,如下所示:gdb:打印AArch64高级SIMD矢量寄存器(有可能吗?)

 │0x4009d0 <Montmul512+80>  umull2 v16.2d, v15.4s, v7.s[3]                   │ 
     >│0x4009d4 <Montmul512+84>  umull2 v17.2d, v13.4s, v7.s[3]                   │ 
     │0x4009d8 <Montmul512+88>  umull2 v18.2d, v14.4s, v7.s[3]                   │ 
     │0x4009dc <Montmul512+92>  umull2 v19.2d, v12.4s, v7.s[3]                   │ 
     │0x4009e0 <Montmul512+96>  umull v20.2d, v15.2s, v7.s[3]                   │ 
     │0x4009e4 <Montmul512+100>  umull v21.2d, v13.2s, v7.s[3]                   │ 
     │0x4009e8 <Montmul512+104>  umull v22.2d, v14.2s, v7.s[3]                   │ 
     └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ 
    (gdb) print v16 
    print v16 
    No symbol "v16" in current context. 

我没有任何左右经验调试汇编代码,所以也许这个问题对许多人来说似乎很简单。任何帮助将不胜感激

+2

通常寄存器名称以gdb中的'$'开头。我不知道AArch64,但尝试'p $ v16'。或者看看'info regs'。 –

尝试info vector所有高级SIMD寄存器(打印在各种布局),或info all-registers v16仅为v16的内容。

+0

您也可以使用'layout reg','tui reg vector'或'tui reg next'在文本UI布局中循环注册窗口模式。 –

您也可以从gdb中打印矢量寄存器,如下面的示例中所示。

(gdb) p $v0 
$101 = {d = {f = {1.2672947890318689e-279, 7.7486181465248912e-304}, u = {434317018741670663, 72340181461566213}, s = {434317018741670663, 72340181461566213}}, s = { 
    f = {2.42644275e-35, 2.53914328e-35, 3.79131591e-37, 2.36942839e-38}, u = {100729607, 101122311, 50397957, 16843011}, s = {100729607, 101122311, 50397957, 
     16843011}}, h = {u = {775, 1537, 263, 1543, 773, 769, 259, 257}, s = {775, 1537, 263, 1543, 773, 769, 259, 257}}, b = {u = {7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 
     3, 1, 1, 1}, s = {7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 1, 1, 1}}, q = {u = {0x01010103030103050607010706010307}, s = {0x01010103030103050607010706010307}}} 

打印不同车道/元素:使用-tui

(gdb) p $v0.q 
$102 = {u = {0x01010103030103050607010706010307}, s = {0x01010103030103050607010706010307}} 
(gdb) p $v0.d 
$103 = {f = {1.2672947890318689e-279, 7.7486181465248912e-304}, u = {434317018741670663, 72340181461566213}, s = {434317018741670663, 72340181461566213}} 
(gdb) p $v0.s 
$104 = {f = {2.42644275e-35, 2.53914328e-35, 3.79131591e-37, 2.36942839e-38}, u = {100729607, 101122311, 50397957, 16843011}, s = {100729607, 101122311, 50397957, 
    16843011}} 
(gdb) p $v0.q.s 
$105 = {0x01010103030103050607010706010307} 
(gdb) p $v0.d.s 
$106 = {434317018741670663, 72340181461566213} 
(gdb) p $v0.d.s[1] 
$107 = 72340181461566213 

以我的经验,布局ASM,布局reg选项往往是拥挤的,如果你没有非常大的显示器。所以如果你在gdb中执行下面的命令,你将很难看到所有的simd寄存器。由于我很懒,我倾向于使用缩写。当它不知道你想要的命令时,GDB会让你知道。

(gdb) wh reg +1 
(gdb) tu reg next