Réponses:
info registersmontre tous les registres; info registers eaxmontre juste le registre eax. La commande peut être abrégée commei r
info registers eax. Je ne suis cependant pas sûr que ce soit différent pour les différentes versions de gdb.
register read [eax]
display. Pour par exemple display $eax.
Si vous essayez d'imprimer un registre spécifique dans GDB, vous devez omettre le signe%. Par exemple,
info registers eip
Si votre exécutable est 64 bits, les registres commencent par r. Les démarrer avec e n'est pas valide.
info registers rip
Ceux-ci peuvent être abrégés en:
i r rip
Il y a aussi:
info all-registers
Ensuite, vous pouvez obtenir le nom du registre qui vous intéresse - très utile pour trouver des registres spécifiques à la plate-forme (comme NEON Q ... sur ARM).
eax, ecxet d' autres registres standards cachés par info registers. Cela devrait probablement être la réponse acceptée.
info registersaffichez les registres.display $espcontinuez à afficher les registres esp dans la ligne de commande gdb.layout regscontinuez à afficher les registres, avec le mode TUI.Commandes gdb :
i r <register_name>: imprimer un seul registre, par exemple i r rax,i r eaxi r <register_name_1> <register_name_2> ...: imprimer plusieurs registres, par exemple i r rdi rsi,i r: imprime tous les registres sauf le registre flottant et vectoriel (xmm, ymm, zmm).i r a: imprimer tous les registres, inclure les registres à virgule flottante et vectoriel (xmm, ymm, zmm).i r f: imprimer tous les registres flottants FPU ( st0-7et quelques autres f*)D'autres groupes de registres en plus de a( all) et f( float) peuvent être trouvés avec:
maint print reggroups
comme documenté à l' adresse : https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers
Conseils :
xmm0~ xmm15, sont 128 bits, presque toutes les machines modernes l'ont, ils sont sortis en 1999.ymm0~ ymm15, sont de 256 bits, les nouvelles machines l'ont généralement, ils sont publiés en 2011.zmm0~ zmm31, sont 512 bits, les PC normaux ne l'ont probablement pas ( comme l'année 2016 ), ils sont sortis en 2013, et principalement utilisés dans les serveurs jusqu'à présent.p $eax fonctionne à partir de GDB 7.7.1
Depuis GDB 7.7.1, la commande que vous avez essayée fonctionne:
set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1
Cette syntaxe peut également être utilisée pour sélectionner entre différents membres de l'union, par exemple pour les registres à virgule flottante ARM qui peuvent être des nombres à virgule flottante ou des entiers:
p $s0.f
p $s0.u
À partir de la documentation :
Tout nom précédé de '$' peut être utilisé pour une variable de commodité, sauf s'il s'agit d'un des noms de registre prédéfinis spécifiques à la machine.
et :
Vous pouvez faire référence au contenu du registre de la machine, dans les expressions, comme des variables dont les noms commencent par «$». Les noms des registres sont différents pour chaque machine; utilisez les registres d'informations pour voir les noms utilisés sur votre machine.
Mais je n'ai pas eu beaucoup de chance avec les registres de contrôle jusqu'à présent: OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || Demande de fonctionnalité 2005 https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I
Registres à virgule flottante ARM
Voir: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623
$syntaxe.
layout regpour que gdb affiche un tableau de tous les registres d'entiers et d'indicateurs, mettant en évidence le ou les registres modifiés par l'instruction précédente. Voir stackoverflow.com/tags/x86/info par exemple.