2016-02-20 70 views
2

我正在嘗試在我的彙編代碼內部進行調試,以檢查高級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'。 –

回答

2

嘗試info vector所有高級SIMD寄存器(打印在各種佈局),或info all-registers v16僅爲v16的內容。

+0

您也可以使用'layout reg','tui reg vector'或'tui reg next'在文本UI佈局中循環註冊窗口模式。 –

2

您也可以從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