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)
향상된 성능을 위해'mov sum, eax'를'findSum'에서'done1'으로 옮길 수 있습니다. 코드 자체가 나에게 맞는 것 같습니다. –
인쇄 코드가 손상되지 않았습니까? –
@JanDvorak 매우 능숙한 팁, 고마워. 하지만 오류는 게시 된 코드의 어딘가에 있다고 생각하지 않습니다. 인쇄 코드는 배열과 변수의 값을 레지스터로 이동 한 다음 함수 덤프를 여러 번 호출하여 레지스터의 값을 인쇄합니다. –