2012-12-11 3 views
0

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 

합, 최소, 최대 모든 dword 값으로 선언됩니다.
이유에 대해 간과해야 할 내용이 있습니까?
a) 합계를 2로 나누어야합니까?
b) 내 findMin 및 findMax 세그먼트가 작동하지 않습니까? (min = 0 & max = acc)

+0

향상된 성능을 위해'mov sum, eax'를'findSum'에서'done1'으로 옮길 수 있습니다. 코드 자체가 나에게 맞는 것 같습니다. –

+1

인쇄 코드가 손상되지 않았습니까? –

+0

@JanDvorak 매우 능숙한 팁, 고마워. 하지만 오류는 게시 된 코드의 어딘가에 있다고 생각하지 않습니다. 인쇄 코드는 배열과 변수의 값을 레지스터로 이동 한 다음 함수 덤프를 여러 번 호출하여 레지스터의 값을 인쇄합니다. –

답변

0

루프 외부의 첫 번째 요소는 처리하지만 카운터는 0부터 시작하여 10으로 이동합니다. 즉, 11 번째 요소를 처리하고 11 번째 요소는 처리 후 메모리 내의 배열

다음 번에 디버거를 사용하여 코드를 단계별로 실행하고 예상치 못한 부분을 확인하십시오.

x86은 [T+ebx*4]의 형식으로 효과적인 주소 지정을 지원하므로 코드가 단순해질 수 있습니다.

+0

아, 와우! 또한 그것은 통찰력을 얻는 것보다 훨씬 간단한 어드레싱 방법입니다! –

+0

또한 내 코드를 확인하는 데 시간을내어 주셔서 감사합니다. –