L'ajout de nombres signés en assemblée
Je veux faire la somme d'un tableau d'éléments. Ce tableau contient les nombres positifs et négatifs.
array db 07, 00, -3, 10, -7, 14, 9, -5, -100
lea ax, data
mov ds, ax
mov es, ax
lea si, array
mov cx, [si]
mov si, 0002h
xor ax, ax
xor dx, dx
Addition:
mov bl, [si]
cmp bl, 00h
jl NEGATIVE
xor bh, bh ;
jmp NEXTT
NEGATIVE:
mov bh, 0ffh
NEXTT:
add ax, bx
adc dx, 0
add si, 1
loop Addition
La somme (DX:AX
) à l'aide de ce code = 0003 FFAE H, ce qui est faux. Je pense que la bonne réponse est
FFFFFFAE H.
1 - Comment puis-je résoudre ce problème?
2 - Comment puis-je savoir si un numéro dans un registre (AX par exemple) est positif ou négatif?
- Je utiliser emu8086
Me semble que les données sont traitées comme des 16 bits - dans ce cas, la réponse (16 derniers bits) est correct. Il n'y a pas de différence entre "grands unsigned nombres positifs" et "négatifs" des chiffres, autant que le CPU est concerné. Il ne devient un problème lors de la conversion en virgule flottante type, de l'imprimer, etc - et c'est là que vous devez savoir si vous êtes représentant d'un entier non signé ou signé entier.
Je vais utiliser la réponse pour obtenir la moyenne de ces valeurs alors d'imprimer la moyenne.
Dans ce cas, vous pouvez simplement définir DX=0 et ne se soucient pas de la porter.
Que faire si la moyenne est négative? C'est sur le connecté nombres, pas de unsigned nombres. Réglage
Si la réponse est signée 16 bits valeur stockée dans
Je vais utiliser la réponse pour obtenir la moyenne de ces valeurs alors d'imprimer la moyenne.
Dans ce cas, vous pouvez simplement définir DX=0 et ne se soucient pas de la porter.
Que faire si la moyenne est négative? C'est sur le connecté nombres, pas de unsigned nombres. Réglage
dx
à zéro échouera toujours dans ce cas.Si la réponse est signée 16 bits valeur stockée dans
ax
, 0xffae est évidemment la bonne réponse. Toutefois, si la réponse doit être signée 32 bits valeur stockée dans dx:ax
, comme dans le code de l'OP, 3:0xffae est pas la bonne réponse (c'est 262062 en décimal) et 0xffff:0xffae est la bonne réponse (c'est -82 en décimal).OriginalL'auteur ammar | 2013-11-30
Vous devez vous connecter pour publier un commentaire.
Il semble que vous ne le manipulez pas de dépassement d'entier, de manière appropriée. Drapeau de portage est pour unsigned l'addition et la soustraction, mais vous voulez signé plus. Indicateur de débordement est pour la signature de plus, il est toujours lorsque les changements de signe.
Edit: Précédente du code non testé ne fonctionne pas correctement. Voici le corrigé (et autonome) du code. Testé avec MASM 6.11.
Le code ci-dessus ne l'entier signé de plus de 8 bits (valeurs de la 8-bit valeurs sont étendues à des valeurs 16 bits). Registre d'utilisation a été modifié pour permettre l'utilisation de
cbw
pour nettoyeur de code. En ajoutant les nombres négatifs a été converti à la soustraction, pour des raisons de simplicité. Codé en dur offset du tableau (mov si, 0002h
, qui ne fonctionne que si le tableau est situé à l'offset 2) a été remplacé parlea si,array
:Et les changements correspondants dans le code:
Et la façon de vérifier si un nombre est positif ou négatif? Ainsi, vous vérifiez le bit le plus élevé. Par exemple, comme dans mon code (
test
n'logique ET mais ne pas enregistrer le résultat, il met à jour uniquement les drapeaux):Désolé, mon erreur. Voir monté et testé le code ci-dessus.
Merci @nrz très peu de temps. Mais ne devrions-nous pas vérifier si il y a un dépassement quand nous ajouter des numéros. Par exemple, lorsque nous ajoutons 0007H, AX et DX devenir 0000H. Ici, il n'y a pas de débordement, mais ne devrions-nous pas vérifier?
Je n'ai pas de comprendre exactement ce que tu veux dire par "quand nous ajouter 0007H, AX et DX devenir 0000H". En x86 assemblée,
add
instruction définit l'indicateur de débordement (DE) lors de la signature de nombre est trop petit (addition de deux nombres signés) ou trop grande (plus de trop positive des nombres signés). Aussi, pour positif des nombres signés de la manipulation de réaliser (avecadc
) est suffisant ici, comme le numéro est stocké dansdx:bx
, pas dansbx
seulement.Je veux dire que DX:AX = 0000 0000H après l'ajout de 0007 pour DX:AX (quand CX=5). Voulez-vous dire que connecteur active directory et cff garantie qu'il n'y aura pas de débordement?
OriginalL'auteur nrz