2012-05-03 1 views
0

Alors permettez-moi de qualifier cela en disant que je suis très nouveau à NASM.MSNA, macro ou sous-programme pour les exposants?

Je convertis une chaîne hexadécimale en un nombre décimal. J'ai la plupart de mon programme en cours d'exécution et j'ai couru dans une section de mon code C que je ne peux pas comprendre comment écrire en assemblée. J'ai la taille de ma chaîne dans CL, et j'ai la valeur entière du caractère hexadécimal enregistré dans AL. Ce que je veux faire est 16^CL * (valeur entière) et puis ajouter cette valeur à EAX (puisque nous avons seulement à faire des chaînes de taille 4, je peux toujours obtenir mes valeurs pour tenir dans EAX).

J'ai travaillé sur cette partie du programme pendant quelques heures maintenant et je semble être perplexe (autre que le codage juste 4096 juste pour le premier, 256 pour le second ... ect, que je déteste avoir à recourir à).

Toute aide serait appréciée.

Répondre

0

Vous n'avez besoin d'aucune fonction d'exposant pour convertir une chaîne hexadécimale en un nombre. Il suffit de multiplier par 16 plusieurs reprises:

#include <stdio.h> 

unsigned long long hex2num(const char* hex) 
{ 
    unsigned long long result = 0; 

    while (*hex != '\0') 
    { 
    char b = *hex; 

    if (b >= 'a' && b <= 'f') b = b - 'a' + 10; 
    else if (b >= 'A' && b <= 'F') b = b - 'A' + 10; 
    else b = b - '0'; 

    result = result * 16 + b; 
    hex++; 
    } 

    return result; 
} 

const char* const testData[] = 
{ 
    "0", 
    "f", 
    "1F", 
    "Ffff", 
    "FFFFFFFF", 
    "7fffffffffffffff" 
}; 

int main(void) 
{ 
    unsigned i; 
    for (i = 0; i < sizeof(testData)/sizeof(testData[0]); i++) 
    printf("\"%s\" = %llu\n", testData[i], hex2num(testData[i])); 
    return 0; 
} 

sortie:

"0" = 0 
"f" = 15 
"1F" = 31 
"Ffff" = 65535 
"FFFFFFFF" = 4294967295 
"7fffffffffffffff" = 9223372036854775807 

On notera également que la multiplication par 16 est équivalent à décalage 4 positions binaires gauche et que l'addition de b peut être remplacé par un bit à bit OU.

+0

Je veux vous mettre en garde mais il ne me laissera pas. = D – AlexLordThorsen

+0

C'est tellement plus simple que ce que j'ai écrit. J'ai compilé mon programme et l'ai exécuté en C et passé mon temps à essayer de le traduire en assemblée. Je ne sais pas si c'est la bonne façon de s'y prendre. – AlexLordThorsen