Jak wydrukować wartość %eax
i %ebp
?
(gdb) p $eax
$1 = void
gdb
cpu-registers
assem
źródło
źródło
layout reg
aby gdb wyświetlał tabelę wszystkich rejestrów liczb całkowitych i flag, podświetlając te zmienione przez poprzednią instrukcję. Zobacz na przykład stackoverflow.com/tags/x86/info .Odpowiedzi:
info registers
pokazuje wszystkie rejestry;info registers eax
pokazuje tylko rejestreax
. Polecenie może być skrócone jakoi r
źródło
info registers eax
. Nie jestem jednak pewien, czy jest inaczej w różnych wersjach gdb.register read [eax]
display
. Dla npdisplay $eax
.Jeśli próbujesz wydrukować konkretny rejestr w GDB, musisz pominąć znak%. Na przykład,
Jeśli plik wykonywalny ma format 64-bitowy, rejestry rozpoczynają się od r. Rozpoczęcie ich od e jest nieprawidłowe.
Można je skrócić do:
źródło
Jest również:
Następnie możesz uzyskać nazwę rejestru, który Cię interesuje - bardzo przydatny do znajdowania rejestrów specyficznych dla platformy (np. NEON Q ... na ARM).
źródło
eax
,ecx
oraz inne standardowe rejestry ukryteinfo registers
. To prawdopodobnie powinna być zaakceptowana odpowiedź.info registers
pokaż rejestry.display $esp
kontynuuj wyświetlanie rejestrów esp w wierszu poleceń gdb.layout regs
kontynuuj pokazywanie rejestrów w trybie TUI.źródło
Komendy Gdb :
i r <register_name>
: Wydrukować jeden rejestr, na przykładi r rax
,i r eax
i r <register_name_1> <register_name_2> ...
: Wydrukować wiele rejestrów, npi r rdi rsi
,i r
: wydrukuj cały rejestr oprócz rejestru zmiennoprzecinkowego i wektorowego (xmm, ymm, zmm).i r a
: wydrukuj cały rejestr, w tym rejestr zmiennoprzecinkowy i wektorowy (xmm, ymm, zmm).i r f
: wydrukuj wszystkie rejestry zmiennoprzecinkowe FPU (st0-7
i kilka innychf*
)Inne grupy rejestrów oprócz
a
(all
) if
(float
) można znaleźć za pomocą:zgodnie z dokumentacją na stronie : https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers
Wskazówki :
xmm0
~xmm15
, mają 128 bitów, prawie każda nowoczesna maszyna ma to, są wydane w 1999 roku.ymm0
~ymm15
, mają 256 bitów, zwykle mają to nowe maszyny, zostały wydane w 2011 roku.zmm0
~zmm31
, mają 512 bitów, normalny komputer prawdopodobnie ich nie ma ( jak w 2016 roku ), są wydane w 2013 roku i do tej pory były używane głównie na serwerach.źródło
p $eax
działa od GDB 7.7.1Począwszy od GDB 7.7.1, wypróbowane polecenie działa:
Tej składni można również użyć do wyboru między różnymi elementami unii, np. Dla rejestrów zmiennoprzecinkowych ARM, które mogą być zmiennoprzecinkowe lub liczb całkowitych:
Z dokumentów :
i :
Ale dotychczas nie miałem dużo szczęścia z rejestrami kontrolnymi: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || Żądanie funkcji w 2005 r. Https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I
Rejestry zmiennoprzecinkowe ARM
Zobacz: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623
źródło
$
składnią.