Answers:
info registers
显示所有寄存器;info registers eax
仅显示寄存器eax
。该命令可以缩写为i r
info registers eax
。不过,我不确定这对于不同版本的gdb是否有所不同。
register read [eax]
display
。例如display $eax
。
还有:
info all-registers
然后,您可以获得感兴趣的寄存器名称-对于查找特定于平台的寄存器(例如ARM上的NEON Q ...)非常有用。
eax
,ecx
以及其它标准由寄存器隐藏info registers
。这可能应该是公认的答案。
Gdb命令:
i r <register_name>
:打印一个寄存器,例如i r rax
,i r eax
i r <register_name_1> <register_name_2> ...
:打印多个寄存器,例如i r rdi rsi
,i r
:打印除浮点和矢量寄存器(xmm,ymm,zmm)以外的所有寄存器。i r a
:打印所有寄存器,包括浮点和矢量寄存器(xmm,ymm,zmm)。i r f
:打印所有FPU浮动寄存器(st0-7
和其他一些f*
)除a
(all
)和f
(float
)外的其他寄存器组还可以通过以下方式找到:
maint print reggroups
如https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers所述
温馨提示:
xmm0
〜xmm15
,是128位,几乎每台现代机器都有它,它们于1999年发布。ymm0
〜ymm15
,是256位,新机器通常有它,它们于2011年发布。zmm0
〜zmm31
,是512位,普通PC可能没有(例如2016年),它们于2013年发布,到目前为止主要用于服务器中。p $eax
从GDB 7.7.1开始工作
从GDB 7.7.1开始,您尝试过的命令起作用:
set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1
此语法还可以用于在不同的并集成员之间进行选择,例如,对于可以为浮点数或整数的ARM浮点寄存器:
p $s0.f
p $s0.u
从文档:
任何以“ $”开头的名称都可以用作便利变量,除非它是预定义的机器专用寄存器名称之一。
和:
您可以在表达式中将机器寄存器的内容称为名称以'$'开头的变量。每台机器的寄存器名称不同。使用信息寄存器查看计算机上使用的名称。
但是到目前为止,我对控制寄存器的运气还不高:OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || 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
ARM浮点寄存器
参见:https : //reverseengineering.stackexchange.com/questions/8992/floating-point-registers-on-arm/20623#20623
$
语法在表达式中使用寄存器真是太好了。
layout reg
使gdb显示所有整数和标志寄存器的表,突出显示上一条指令更改的表。例如,请参阅stackoverflow.com/tags/x86/info。