2017-06-20 3 views
1

J'étudie actuellement le langage d'assemblage x86 en suivant le livre de Kip Irvine.Que se passe-t-il si j'initialise un BYTE ou un SBYTE avec une valeur trop grande pour l'adapter?

Dans le livre, l'auteur a déclaré:

3.4.4 Définition BYTE et sbyte données

Le BYTE (octet définir) et sbyte (définir l'octet signé) directives pour le stockage d'allouer un ou plusieurs valeurs non signées ou signées. Chaque initialiseur doit correspondre à 8 bits de stockage .

Je me demandais juste, et si je assignais accidentellement une valeur qui est trop grande pour la zone de stockage? Quel genre de comportement devrais-je attendre? En raison de mon inexpérience, je ne pouvais pas trouver un exemple qui démontre le comportement, donc ce serait génial si quelqu'un pouvait fournir une explication avec un exemple de code.

+1

Vous ne pouvez pas, ceci est une directive de compilation, l'assembleur signale une erreur. Dans votre code, vous utilisez les accès de taille appropriée, donc normalement le pire qui puisse arriver est la troncature/débordement. Si vous gâchez d'une manière ou d'une autre les tailles de données, vous pouvez écraser d'autres éléments en mémoire. – Jester

+0

@Jester merci beaucoup pour le commentaire. Il me semble que vous avez de l'expérience en programmation en langage assembleur, cela vous dérange-t-il si je vous demande quel est le chemin d'apprentissage que vous avez suivi en étudiant l'assemblage et dans quel domaine trouvez-vous le plus utile? Toute réponse serait grandement appréciée, il ne faut pas trop longtemps, une ou deux phrases suffiront amplement. Merci encore! – Thor

+1

Le chemin que j'ai suivi étudiait le désassemblage généré par l'optimisation des compilateurs, avec les manuels de référence Intel en main. C'est un chemin plutôt fastidieux, qui prend un certain temps, mais il en résulte une connaissance * très * pratique: être capable de comprendre ce que les compilateurs génèrent et pourquoi. Les livres sont aussi un excellent moyen d'apprendre. Le classique de Michael Abrash [* Zen of Assembly Language *] (http://www.jagregory.com/abrash-zen-of-asm/) mérite d'être lu. C'est un vieux livre qui se concentre principalement sur la programmation en langage assembleur 16 bits pour le 8088, donc vous ne le lisez pas pour la syntaxe, mais pour les intuitions intemporelles. –

Répondre

1

Alors disons que vous avez une étiquette MyMemoryLocation, entre autres étiquettes, et vous l'avez écrit comme ceci:

.DATA 
Before   BYTE 0 
MyMemoryLocation BYTE 0 
After   BYTE 0 

Et vous avez le code obtenu que les abus et l'étiquette essaie de l'utiliser dans un opération 16 bits:

.CODE 
MOV AX, 1234H 
MOV MyMemoryLocation, AX 

Si vous ne recevez pas une erreur assembleur (MASM vous donnera « différence de taille de Opérande »), la valeur AX sera écrit à l'adresse à partir de MyMemoryLocation. Comme 80x86 est little-endian, l'octet le moins significatif sera écrit en premier, à MyMemoryLocation. Le deuxième octet sera écrit dans la mémoire immédiatement après, au After. Donc, vous finiriez avec:

Before   BYTE 0 
MyMemoryLocation BYTE 34H 
After    BYTE 12H 
+0

s'il vous plaît corrigez-moi si je me trompe, je comprends que, lorsque la valeur assignée est plus grande que la zone de stockage, MASM augmentera très probablement une erreur de compilation. Si aucune erreur de compilation n'est détectée, la valeur affectée déborde dans la zone de stockage adjacente. – Thor

+1

C'est exact. –

+0

C'est exact, mais ce n'est pas exactement ce dont parle Irvine dans le livre. Il mentionne le besoin de * initializer * pour entrer dans 8 octets, ce qui serait 'MyMemoryLocation BYTE 1024'. Différent d'un magasin d'exécution. –