2014-11-12 6 views
0

할당 코드에 문제가 있습니다. 평균을 구하기 위해 배열의 숫자를 계산하기 위해 참조되는 함수입니다. 그것은 아래의 함수로 전달됩니다. 배열에서 실제 값을 가져 오는 데 문제가 있습니다. 어셈블리에서 배열 사용에 대한 정보를 찾으려고 무서운 시간을 보내고 있습니다. 참조/주소 데이터를 가져 오는 것 같습니다. 도움????어셈블리의 배열 요소 액세스 x86

** 아래 코드 중 일부는 수업 중에 가져온 메모에서 가져온 것이고 나머지는 공백을 채우려는 것입니다. 따라 와서 미안해. 미안해.

.586    

.MODEL FLAT, C 

.STACK 
.DATA 

.CODE 

AverageFunc PROC 

NoOfElemenstsDW EQU 08 ArrayAddrStartPtr EQU 12 

push ebp 

mov ebp, esp 

push edi 

push ecx 

mov ecx, [ebp + NoOfElemenstsDW ] 

mov edi, [ebp + ArrayAddrStartPtr] 

sub ebx, ebx ;set ebx to 0 

sub eax, eax ;set eax to 0 

sub edx, edx ;must set to 0 to get accurate division 

L1: 

add eax, [edi] ;add value to total 

inc edi ;go to next point in the array 

add ebx, 1 ;add 1 to the counter 

cmp ebx, ecx ;compare ecx and ebx 

jl L1 ;If ebx < ecx, loop again 

div ecx ;divide sum by total numbers 

pop ecx 

pop edi 

pop ebp 

ret 

AverageFunc ENDP 

END 
+0

이 함수를 어떻게 호출하는지 (즉, 실제 매개 변수로 전달하는 것) 표시하지 않았습니다. – Michael

답변

0

AverageFunc가 EAX 만 리턴해야한다면 EDX를 계속 눌러야합니다.

이 2 당신이 또한 것이다 곧 오버 플로우 또한 1

대신에 4 EDI를 올릴 필요가 더블 워드에 EDI 점 때문에 함께

add eax, [edi] ;add value to total 
inc edi ;go to next point in the array 

하지 않습니다. 예방 바로 L1 라벨 전에 적합한 jecxz 말했듯

add eax,[edi] 
adc edx,0 

으로 해결.

ps 따라야 할 때가 너무 두렵다. 그렇게 생각하지 마십시오. 이 포럼에서 본 코드 중 더 나은 코드 중 하나입니다.

+0

감사합니다! 이것을 시험해보고 문제가 해결되는지 확인해 보겠습니다. 우리는 방금 C++을 사용하여 별도의 .asm 파일에서 프로 시저를 호출하는 것으로 옮겼습니다. (아직 코드가 포함되어 있지 않습니다.) 스택을 사용하는 데 여전히 익숙해 져서 모든 것이 섞여 있습니다. – Brittney

관련 문제