【发布时间】:2013-12-16 15:00:15
【问题描述】:
我想对数组元素求和。该数组包含正数和负数。
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
使用此代码的总和 (DX:AX) = 0003 FFAE H,这是错误的。我认为正确的答案是
FFFFFFAE H.
1- 我该如何解决这个问题?
2- 如何知道寄存器中的数字(例如 AX)是正数还是负数?
我用的是emu8086
【问题讨论】:
-
在我看来,传入的数据被视为 16 位数字 - 在这种情况下,答案(最后 16 位)是正确的。就 CPU 而言,“大无符号正数”和“负”数之间没有区别。只有当您转换为浮点类型、将其打印出来等时,它才会成为一个问题——此时您需要知道您是代表无符号整数还是有符号整数。
-
我将使用答案来获取这些值的平均值,然后打印平均值。
-
在这种情况下,您可以简单地设置 DX=0 而无需关心进位。
-
@valplo 如果平均值为负数怎么办?这是关于有符号数字,而不是无符号数字。在这种情况下,将
dx设置为零将始终失败。 -
@Floris 如果答案是存储在
ax中的带符号16 位 值,0xffae 显然是正确答案。但是,如果答案应该是存储在dx:ax中的有符号32 位 值,如OP 的代码中所示,则3:0xffae 是错误答案(十进制为262062)并且0xffff:0xffae 是正确答案(十进制为 -82)。
标签: assembly x86 signed addition x86-16