2016-03-05 20 views
-1

我想获得x86机器上所有可用寄存器的列表。可以通过编程的方式列出x86机器上的所有寄存器?

我的主要目标是获得名称列表,即使是一个简单的列表,只需要所有寄存器的名字就足够了(没有任何描述);我会采取任何东西,shell实用程序,c库,posix库,伪文件系统设置...我愿意使用任何东西。

+0

你想要他们的助记名称,还是你想遍历在机器代码中使用它们的数字编码? (例如在'mod/rm'字节中)。请注意,它们不符合您的预期顺序:'ebx'出现故障。有关文档的链接,请参见[x86标记wiki](http://stackoverflow.com/tags/x86/info)。 –

+0

@PeterCordes第一个,助记名 – xelp

回答

2

看看你的问题标签我认为你的意思是x86处理器注册。

不幸的是,你不能直接得到这些列表。注册名称如'AH,AL,AX'是帮助我们人类的助记符,处理器本身没有这些名称的概念。

你的列表将必须来自次级源,例如一个处理器参考,汇编文档,维基等

+0

和一个调试器,不要再看了。 –

1

没有列出所有寄存器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编写脚本,所以我敢肯定,你可以得到,而无需用户交互是转储(不使用expect模拟GDB的用户输入)。

+0

谢谢,但我已经知道gdb能够跟踪每个寄存器的状态,我的问题是关于只用一个简单的实用程序就可以获得机器寄存器的完整画面,而不必知道存在哪种硬件(但始终在x86 archs上)。那么这个寄存器的“数字”表示呢?我在哪里可以找到那种信息? – xelp

+0

@xelp:在描述x86 ISA的英特尔手册中。 –

相关问题