可以通过编程方式列出 x86 计算机上的所有寄存器



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

我的主要目标是获取名称列表,即使是仅包含所有寄存器名称的简单列表也足够了(没有任何描述);我会拿任何东西,外壳实用程序,c库,posix库,伪文件系统设置...我愿意使用任何东西.

查看您的问题标签,我想您的意思是 x86 处理器寄存器。

不幸的是,您无法直接获得这些列表。 诸如"AH,AL,AX"之类的寄存器名称是帮助我们人类的助记符,处理器本身对这些名称没有概念。

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

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

除此之外,请参阅英特尔手册或从 x86 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 是可编写脚本的,因此我相信您可以在没有用户交互的情况下获得该转储(无需使用 expect 来模拟 gdb 的用户输入)。

最新更新