【问题标题】:It's possible to programmatically list all the registers on an x86 machine?可以以编程方式列出 x86 机器上的所有寄存器吗?
【发布时间】:2016-03-05 05:37:39
【问题描述】:

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

我的主要目标是获取名称列表,即使是仅包含所有寄存器名称的简单列表也足够了(无需任何描述);我什么都愿意,shell 实用程序、c 库、posix 库、伪文件系统设置……我愿意使用任何东西。

【问题讨论】:

  • 您想要它们的助记名称,还是要遍历机器代码中使用的数字编码? (例如在mod/rm 字节中)。请注意,它们的顺序不符合您的预期:ebx 出现故障。有关文档的链接,请参阅 x86 tag wiki
  • @PeterCordes 第一个,助记符名称

标签: x86 cpu-registers


【解决方案1】:

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

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

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

【讨论】:

  • 还有一个调试器,别再看了。
【解决方案2】:

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

【讨论】:

  • 谢谢,但我已经知道 gdb 能够跟踪每个寄存器的状态,我的问题是只需要一个简单的实用程序就可以全面了解机器寄存器,甚至不知道是什么硬件那里(但总是在 x86 拱门上)。这个寄存器的“数字”表示怎么样?我在哪里可以找到这类信息?
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 2019-08-23
  • 2013-01-05
  • 1970-01-01
  • 2010-12-06
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多