数组&汇编中的循环...代码未输出正确的值

时间:2012-12-11 06:04:49

标签: arrays assembly for-loop conditional-statements ia-32

我有一个具有10个值的数组T,特别是(如果重要的话)和顺序:2d,5c,5b,d3,9b,9a,48,f1,e8,& 59.
在我的代码中,我试图找到总和,最小值,最大值和平均值 好吧,我得到了总和和平均值,但由于某种原因,我必须将它除以2才能找到正确的答案......很奇怪。现在有一点我的findMin代码工作,(给了我2d),但现在它不是(只给0)。 findMax也给了我一个在数组中甚至不存在的值。 这是代码:

done:   
mov ebx, 0      ;clear for loop counter
mov ecx, 0      ;clear array pointer
mov eax, [T]    ;base case for sum

findSum:
cmp ebx, 10
jge done1       ;if loop count = 10, done
add ecx, 4      ;point to next array value
add eax, [T+ecx]    ;add to register eax
inc ebx
mov sum, eax    ;store sum in var 'sum'
jmp findSum

done1:
;; resets regs for loop counter
mov ebx, 0
mov ecx, 0
mov eax, [T]    ;first val of table is min by default
jmp findMin

findMin:
;; finds the lowest value in table, first value is min by default
cmp ebx, 10     ;while ebx != 10
jge done2       ;else done
add ecx, 4      ;point to next value of array
inc ebx     ;increment loop counter
cmp [T+ecx], eax    ;if value at T is greater than eax(min) 
jge findMin     ;compare next value to min
mov eax, [T+ecx]    ;else value is less than min, assigns to reg eax
mov min, eax    ;assigns it to var min
jmp findMin

done2:
;; resets regs for loop  counter
mov ebx, 0
mov ecx, 0
mov eax, [T]    ;first val of table is max by default
jmp findMax

findMax:
;; finds the highest value in the table, first val is max by default
cmp ebx, 10     ;while ebx != 0
jge findAvg     ; else done
add ecx, 4      ;to point to next value in array
inc ebx     ;increment loop counter
cmp [T+ecx], eax    ;if value at array is less than max(eax)
jle findMax     ;compare next values
mov eax, [T+ecx]    ;else value is greater than max, assign to reg eax
mov max, eax    ;assign to var max
jmp findMax

sum,min,max都声明为dwords 你看到我必须忽略的原因是什么:
a)总和必须除以2才能得到正确的总和?
b)我的findMin和findMax段不起作用? (min = 0& max = acc)

1 个答案:

答案 0 :(得分:0)

您正在处理循环外的第一个元素,但您的计数器仍然从零开始并且变为10.这意味着,您将处理11个元素,第11个元素访问内存中数组之后的任何元素。

下次使用调试器逐步执行代码,看看它在哪里做了意想不到的事情。

请注意,x86支持[T+ebx*4]形式的有效寻址,这可以简化您的代码。