В прошлый раз я смог запустить программу, но она, насколько понимаю, завершалась некорректно. Сегодня я посмотрю значения регистров. Делать это буду через отладчик gdb.
Выяснил, что содержимое регистров, начинающихся с буквы r, можно посмотреть командой
info r-registers
или просто
info registers
Содержимое предикатных регистров можно посмотреть командой
info pred-registers
Чтобы вывести содержимое регистров ctpr, к сожалению, отдельной команды не нашёл.
Поэтому, чтобы просмотреть их значения, нужно вывести значения всех регистров.
Содержимое всех регистров выводится командой
info all-registers
Выводить содержимое регистров нужно во время выполнения программы (поставив точку останова). Иначе не получится.
Пример вывода для регистров r
(gdb) info r-registers r0 <00> 0x0 0 r1 <00> 0x10078 65656 r2 <00> 0x20370 131952 r3 <00> 0x0 0 r4 <00> 0x0 0 r5 <00> 0x4fe000000000 87823491268608 r6 <00> 0x4fe0000000c4 87823491268804 r7 <00> 0xc2e000002000 214267328471040
Пример вывода для предикатных регистров pred
(gdb) info pred-registers pred0 <0> 1 pred1 <0> 1 pred2 <0> 0 pred3 <0> 0 pred4 <0> 1 pred5 <0> 1 pred6 <0> 0 pred7 <0> 0 pred8 <0> 1 pred9 <0> 0 pred10 <0> 0 pred11 <0> 0 pred12 <0> 0 pred13 <0> 1 pred14 <0> 1 pred15 <0> 1 pred16 <0> 0 pred17 <0> 0 pred18 <0> 1 pred19 <0> 1 pred20 <0> 0 pred21 <1> 0 pred22 <1> 0 pred23 <1> 0 pred24 <1> 0 pred25 <1> 0 pred26 <1> 0 pred27 <1> 0 pred28 <1> 0 pred29 <1> 0 pred30 <1> 0 pred31 <1> 0
Пример вывода для всех регистров. Вывод очень большой, я его обрезал до только нужных мне регистров ctpr
(gdb) info all-registers
...
ctpr1 0x1800e200000730c8 1729630746538619080
ta_base 0xe200000730c8 248489628348616
ta_tag 0x0 0
opc 0x0 0
ipd 0x3 3
ctpr2 0x1800e20000073100 1729630746538619136
ta_base 0xe20000073100 248489628348672
ta_tag 0x0 0
opc 0x0 0
ipd 0x3 3
ctpr3 0x1e000000000100b0 2161727821137903792
ta_base 0x100b0 65712
ta_tag 0x0 0
opc 0x3 3
ipd 0x3 3
...
Как видно, регистры ctpr, можно сказать, многослойные: делятся на ta_base, ta_tag, opc и ipd. Как я понял, это всё лежит в одном регистре и из него просто выделяются отдельные числа (путём наложения битовой маски и сдвигов).
Есть ещё команды для вывода регистров: info aau-registers, info br-registers, info chain-registers, info dbg-registers, info g-registers, info mem-registers, info os-registers, info xbr-registers, info xg-registers, info xr-registers. Но для моей простейшей программы пока они не нужны.
В следующий раз уже посмотрю, как изменяются значения регистров по ходу выполнения программы. А возможно и попробую другой режим отображения gdb, чтобы видеть содержимое регистров в реальном времени.
