2011-02-23 4 views
2

compte les éléments suivants deux déclarations d'un programme en langage assembleur très simple:pourquoi l'assembleur ne signale pas d'erreur sur ceci?

DATA1 DB +200 
DATA2 DB -130 

lorsque je tente de l'assembler, l'assembleur donne erreur sur aucune déclaration 2, car il doit depuis un octet peut contenir au-delà de -128 décimal . Mais pourquoi l'assembleur n'a pas donné d'erreur sur la déclaration no 1? après tout, un octet peut contenir au maximum 127 entiers positifs signés. Au lieu de cela, assemlber place la valeur C8 dans cet octet.

Répondre

3

Tout nombre est converti en un tableau de bits lorsqu'il est assemblé dans l'exécutable. -1, par exemple, est 0xFF, -2 est 0xFE, etc. La seule différence entre -1 et 255 est comment il est utilisé dans votre code. L'assembleur s'en fout, il veut juste stocker les données à utiliser.

+0

Donc, lors de l'attribution de la valeur +200, l'assembleur ne se soucierait pas du bit de signe et utiliserait le msb également comme faisant partie des bits de la valeur 200? – KawaiKx

+1

@Saurabh - Correct, le + n'est pas nécessaire dans cet exemple. Le MSB n'est pas important dans ce cas car tous les entiers sont non signés. – Sparafusile

3

Peut-être ne sait-il pas si le littéral est signé ou non. Pour un assembleur, je ne trouve pas cela trop surprenant, il y a des cas d'utilisation pour les deux. Ne correspond jamais à un octet, puisqu'il doit être signé et est plus petit que -128. 200, d'autre part, s'adapte très bien dans un octet non signé, et cela semble être la vue que l'assembleur prend, 0xC8 est 200 s'il est interprété comme un octet non signé.

+0

je mets le signe « + » pour dire l'assembleur que c'est un entier signé, il n'a toujours pas d'objection à l'excédence de frontière. Cela signifie-t-il que le programmeur doit s'assurer que tout en affectant des valeurs aux variables, il ne doit pas dépasser les limites du type déclaré de variables? Si c'est le cas, pourquoi cette fonctionnalité ne peut-elle être ajoutée dans les assembleurs? – KawaiKx

+1

@Saurabh - Si vous voulez un bâton de frappe fort avec une langue de niveau supérieur. Dans l'assemblage, tout est BYTE, WORD ou DWORD. La seule différence entre un DWORD signé, DWORD non signé, ou HANDLE est comment vous les utilisez. – Sparafusile

+0

Pour renforcer ce que dit @Sparafusile. Il n'y a pas de véritables valeurs "signed" et "unsigned" dans les instructions de données d'assembly. "+200" est le même que "200", ce qui est parfaitement légal dans un octet. "-120" l'assembleur se tournera, pour plus de commodité, vers la valeur appropriée pour vous. "-130" ne correspond pas, donc c'est une erreur. –

1

donc l'essentiel est:

Le contenu d'un champ signifie que vous leur intention de dire. Le résultat de tout cela est que vous devez avoir une bonne idée de l'ampleur des chiffres que votre programme va traiter, et vous devez définir les tailles de champs en conséquence.

«Langage et programmation d'assemblage de PC IBM» de Peter Abel.

aussi du même auteur « ADD et instructions SUB ne permettent pas de distinguer entre non signé et signé des données et, en effet, il suffit d'ajouter et de soustraire les bits »

Questions connexes