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 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