Пробую отладку, часть 1 (ассемблер Эльбрус)

В прошлый раз я смог запустить программу, но она, насколько понимаю, завершалась некорректно. Сегодня я посмотрю значения регистров. Делать это буду через отладчик 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, чтобы видеть содержимое регистров в реальном времени.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *