没有列出所有寄存器的 CPU 指令。制作有效的机器代码首先需要知道编码,因此花费晶体管让 CPU 拥有这样的列表是没有意义的。 CPUID 指令会告诉您 CPU 是否支持 Long Mode、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 的用户输入)。