2016-03-05 2 views
-1

Je voudrais obtenir une liste de tous les registres disponibles sur une machine x86.Il est possible de lister par programme tous les registres sur une machine x86?

Mon objectif principal est d'obtenir la liste des noms, même une simple liste avec juste le nom de tous les registres suffira (sans aucune description); Je vais prendre n'importe quoi, l'utilitaire shell, les bibliothèques c, les bibliothèques posix, les paramètres de pseudo systèmes de fichiers ... Je suis prêt à utiliser n'importe quoi.

+0

Voulez-vous leurs noms mnémoniques, ou voulez-vous parcourir les codages numériques utilisés dans le code machine? (par exemple dans l'octet 'mod/rm'). Notez qu'ils ne sont pas dans l'ordre attendu: 'ebx' est hors service. Voir le [wiki tag x86] (http://stackoverflow.com/tags/x86/info) pour les liens vers docs. –

+0

@PeterCordes le premier, les noms mnémoniques – xelp

Répondre

2

En regardant vos étiquettes de question je présume que vous voulez dire les registres du processeur x86.

Malheureusement, vous ne pouvez pas obtenir une liste de ceux-ci directement. Les noms de registre tels que 'AH, AL, AX' sont des mnémoniques pour nous aider les humains, le processeur lui-même n'a aucun concept de ces noms.

Votre liste devra provenir de sources secondaires une telle référence du processeur, docs assembleur, wiki, etc.

+0

Et un débogueur, ne cherchez pas plus loin. –

1

Il n'y a aucune instruction CPU qui répertorie tous les registres. Faire un code machine valide nécessite de connaître les encodages en premier lieu, il n'y aurait donc aucun intérêt à dépenser des transistors pour que le CPU conserve une telle liste. L'instruction CPUID vous indique si la CPU prend en charge les modes Long, SSE et AVX, ce qui vous permet de savoir si ces ensembles de registres sont disponibles.

Autre que cela, voir les manuels Intel ou enregistrer les diagrammes liés à partir du wiki .


Il existe des programmes qui ont des listes de registres compilés dans ces programmes. Celui qui vient à l'esprit est 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 est scriptable, donc je suis sûr que vous pourriez obtenir cette décharge sans interaction de l'utilisateur (sans utiliser expect pour simuler l'entrée d'utilisateur pour gdb).

+0

merci, mais je sais déjà que gdb est capable de suivre l'état de chaque registre, mon problème est d'obtenir une image complète des registres de la machine avec un simple utilitaire sans même savoir quel type de matériel est là (mais toujours sur x86 archs). Qu'en est-il de la représentation "numérique" de ces registres? Où puis-je trouver ce genre d'information? – xelp

+0

@xelp: Dans les manuels Intel qui documentent l'architecture ISA x86. –