我想在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 的用户输入)。