Всем доброго вечера

Глупый вопрос, но ответа не нашел.

наверное, проще всего пояснить его на возникшем примере. (а иначе я просто внятно и не сформулирую)
(gdb) p/x $ebp
$125 = 0xbffff108

С другой стороны
(gdb) x/8x &wis[128]
0xbffff0f8: 0x00000012 0xbffff130 0x00000000 0xbffff530
0xbffff108: 0xbffff548 0x0804880d 0xbffff130 0xbffff130

ebp должен быть там, но его нет!
нагуглил чисто случайно кусок мануала, где ebp читался так:
(gdb) p/x *(unsigned *) $ebp
$131 = 0xbffff548
И да, теперь ebp нашелся

Но в итоге что за чудеса? По какому принципу вообще определить какой волшебный тип указывать, во избежания такиз недоразумений, и почему сам gdb выводит по p в одном виде, а в x, в другом один и тот же кусок памяти. Опции форматированяи разного и там и там есть же.

Наверное, ответ это где-то содержится в мануале, но где именно?

info registers выводит тоже 0xbffff108.

если гуглить, то для всех очевидно stackoverflow.com/questions/15869168/gnu-gdb-cu... (вот например) что надо выводить именно в таком виде. В других местах сразу выводят "как надо", не поясняя ни капли. Но я чего-то не допонимаю. в ebp лежит адрес, он iзанимает 4 байта и итак int вроде. Что зс ним происходит если явно указать тип? По какому принципу вообще присходит это преобразование:0xbffff108 -> 0xbffff548.