我想获得x86机器上所有可用寄存器的列表。可以通过编程的方式列出x86机器上的所有寄存器?
我的主要目标是获得名称列表,即使是一个简单的列表,只需要所有寄存器的名字就足够了(没有任何描述);我会采取任何东西,shell实用程序,c库,posix库,伪文件系统设置...我愿意使用任何东西。
我想获得x86机器上所有可用寄存器的列表。可以通过编程的方式列出x86机器上的所有寄存器?
我的主要目标是获得名称列表,即使是一个简单的列表,只需要所有寄存器的名字就足够了(没有任何描述);我会采取任何东西,shell实用程序,c库,posix库,伪文件系统设置...我愿意使用任何东西。
看看你的问题标签我认为你的意思是x86处理器注册。
不幸的是,你不能直接得到这些列表。注册名称如'AH,AL,AX'是帮助我们人类的助记符,处理器本身没有这些名称的概念。
你的列表将必须来自次级源,例如一个处理器参考,汇编文档,维基等
和一个调试器,不要再看了。 –
没有列出所有寄存器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的用户输入)。
谢谢,但我已经知道gdb能够跟踪每个寄存器的状态,我的问题是关于只用一个简单的实用程序就可以获得机器寄存器的完整画面,而不必知道存在哪种硬件(但始终在x86 archs上)。那么这个寄存器的“数字”表示呢?我在哪里可以找到那种信息? – xelp
@xelp:在描述x86 ISA的英特尔手册中。 –
你想要他们的助记名称,还是你想遍历在机器代码中使用它们的数字编码? (例如在'mod/rm'字节中)。请注意,它们不符合您的预期顺序:'ebx'出现故障。有关文档的链接,请参见[x86标记wiki](http://stackoverflow.com/tags/x86/info)。 –
@PeterCordes第一个,助记名 – xelp