它';是否可以通过编程方式列出x86机器上的所有寄存器?

它';是否可以通过编程方式列出x86机器上的所有寄存器?,x86,cpu-registers,X86,Cpu Registers,我想获得x86机器上所有可用寄存器的列表 我的主要目标是得到名单的名字,即使是一个简单的名单,只是所有登记册的名称将足够(没有任何说明);我会接受任何东西,shell实用程序,c库,posix库,伪文件系统设置。。。我愿意使用任何东西。看看你的问题标签,我猜你指的是x86处理器寄存器 不幸的是,您无法直接获得这些内容的列表。诸如“啊,AL,AX”之类的注册名是帮助我们人类的助记符,处理器本身没有这些名称的概念 您的列表必须来自次要来源,如处理器参考、汇编文档、wiki等。没有列出所有寄存器的CP

我想获得x86机器上所有可用寄存器的列表


我的主要目标是得到名单的名字,即使是一个简单的名单,只是所有登记册的名称将足够(没有任何说明);我会接受任何东西,shell实用程序,c库,posix库,伪文件系统设置。。。我愿意使用任何东西。

看看你的问题标签,我猜你指的是x86处理器寄存器

不幸的是,您无法直接获得这些内容的列表。诸如“啊,AL,AX”之类的注册名是帮助我们人类的助记符,处理器本身没有这些名称的概念


您的列表必须来自次要来源,如处理器参考、汇编文档、wiki等。

没有列出所有寄存器的CPU指令。生成有效的机器代码首先需要知道编码,因此没有必要花费晶体管使CPU保存这样的列表。CPUID指令将告诉您CPU是否支持长模式、SSE和AVX,因此您可以从中判断这些寄存器集是否可用

除此之外,请参阅wiki链接的英特尔手册或注册图表


有些程序中编译了寄存器列表。我想到的是
gdb

$ gdb /bin/true
(gdb) b _start
Function "_start" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (_start) pending.
(gdb) r
Starting program: /bin/true 

Breakpoint 1, 0x00007ffff7dd9cd0 in _start () from /lib64/ld-linux-x86-64.so.2
(gdb) info reg all
rax            0x0      0
rbx            0x0      0
rcx            0x0      0
...
r15            0x0      0
rip            0x7ffff7dd9cd0   0x7ffff7dd9cd0 <_start>
eflags         0x202    [ IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0
st0            0        (raw 0x00000000000000000000)
...
fctrl          0x37f    895
fstat          0x0      0
ftag           0xffff   65535
fiseg          0x0      0
fioff          0x0      0
foseg          0x0      0
fooff          0x0      0
fop            0x0      0
mxcsr          0x1f80   [ IM DM ZM OM UM PM ]
ymm0           {v8_float = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_double = {0x0, 0x0, 0x0, 0x0}, v32_int8 = {0x0 <repeats 32 times>}, v16_int16 = {
    0x0 <repeats 16 times>}, v8_int32 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, v4_int64 = {0x0, 0x0, 0x0, 0x0}, v2_int128 = {0x00000000000000000000000000000000, 
    0x00000000000000000000000000000000}}
...
ymm15          ...
$gdb/bin/true
(gdb)b_启动
未定义函数“\u start”。
是否在将来加载共享库时使断点挂起?(y或[n])y
断点1(_start)挂起。
(gdb)r
正在启动程序:/bin/true
断点1,0x00007ffff7dd9cd0位于/lib64/ld-linux-x86-64.so.2的_start()中
(gdb)信息注册全部
rax 0x0 0
rbx 0x0 0
rcx 0x0 0
...
r15 0x0 0
rip 0x7ffff7dd9cd0 0x7ffff7dd9cd0
eflags 0x202[如果]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
st0 0(原始0x00000000000000)
...
fctrl 0x37f 895
fstat0x0
ftag 0xffff 65535
fiseg 0x0 0
fioff 0x0 0
foseg 0x0 0
fooff 0x0 0
fop 0x0 0
mxcsr 0x1f80[IM DM ZM OM UM PM]
ymm0{v8_float={0x0,0x0,0x0,0x0,0x0,0x0,0x0},v4_double={0x0,0x0,0x0,0x0},v32_int8={0x0},v16_int16}{
0x0},v8_int32={0x0,0x0,0x0,0x0,0x0,0x0},v4_int64={0x0,0x0,0x0,0x0},v2_int128={0x00000000000000,
0x00000000000000000000000000}
...
ymm15。。。

GDB是可编写脚本的,因此我确信您可以在无需用户交互的情况下获得转储(无需使用
expect
模拟GDB的用户输入)。

您想要它们的助记符名称,还是要迭代机器代码中使用的数字编码?(例如,在
mod/rm
字节中)。请注意,它们不是您期望的顺序:
ebx
出现故障。有关文档的链接,请参见。@PeterCordes第一个,助记符名称和调试器,请不要再看了。谢谢,但我已经知道gdb能够跟踪每个寄存器的状态,我的问题是,只需一个简单的实用程序,就可以完整地了解机器寄存器,而不需要知道那里有什么硬件(但总是在x86 ARCH上)。这个寄存器的“数字”表示形式如何?在哪里可以找到这种信息?