2017-10-17 4 views
0

J'étais curieux de savoir comment GDB détermine si une valeur est signée ou non signée. J'ai créé un petit programme qui stocke une valeur négative signée dans eax. Je l'ai exécuté à travers le débogueur, et j'ai remarqué qu'il interprète la valeur à eax pour être négatif. Comment est-ce ainsi? J'ai également essayé ceci sans générer d'informations de débogage. Voici mon programme court:Comment GDB sait-il si une valeur est signée?

section .text 
global _start 
_start: 
    nop 
    mov eax, [doubleWord] 
    mov ebx, 0 
    mov eax, 1 
    int 0x80 
section .data 
    doubleWord dd -52 
+1

Dépend de la manière dont vous l'avez imprimée. Le 'd' (décimal) et' f' (float) est signé, le reste, y compris 'u' et' x' sont non signés. – Jester

+1

Vous lui dites comment interpréter la valeur (il n'y a aucun moyen de dire à partir des bits eux-mêmes). – Ped7g

+0

bonne chance, que se passe-t-il lorsque vous utilisez un fichier non signé ou un fichier flottant, est-ce qu'il devine ce droit ou simplement en fait un nombre signé décimal? (Ma conjecture est la dernière) –

Répondre

1

Pour le code généré par le compilateur, debug info specifies the types for global symbols.

Sans informations de débogage, je pense que gdb suppose simplement que tout est int.

Vous pourrait informations de débogage main-code vous-même, mais il est très lourd et généralement plus facile à remplacer simplement les types avec des moulages ou spécificateurs pour p et x commandes. (https://sourceware.org/gdb/current/onlinedocs/gdb/Data.html#Data)

Par exemple, p /x $eax pour imprimer EAX sous la forme d'un entier hexadécimal (non signé). En outre, layout reg est agréable. Voir plus de conseils de débogage asm pour strace et gdb au bas du wiki tag .

+1

Merci pour la réponse. J'ai essayé de taper la valeur hexadécimale de EAX et il a interprété 0xffffffcc comme -52. De plus, ptype a retourné int_32, donc il gère la valeur comme un entier signé. – user7355630