2017-11-13 15 views
-1

업데이트 (2017-11-13) :MASM 배열이 루핑되지 않음

다른 변수 "index"를 추가하고 0으로 설정했습니다. 그런 다음 모든 .IF 루프가 끝나면 인덱스에 4 (DWORD)를 추가 한 다음 esi 레지스터로 전달하고 올바른 배열 변수를 가리 킵니다. 또한 includedCounter 변수를 .IF 루프 외부로 옮겼습니다. 대답은 이제 정확합니다 !!

I가되어> = 3 어레이로의 포인터 [ESI]가 유일한 배열의 첫 번째 값을 "반복"한다 & & < = 8 (배열과 합 값만 통해 루프려고 삼).

ESI가 다음 배열로 증가하지 않는 이유는 무엇입니까?

값은 합계에 대해 "64"를 반환하고 includedCounter에 대해 "13"을 반환해야합니다. 현재 값은 sum에 대해 "60"으로 반환되고 includesCounter에 대해 "20"으로 반환됩니다.이 값은 배열의 각 정수가 가리키는 대신 배열의 첫 번째 정수가 계속 가리키고 있음을 나타냅니다.

; Calculates the sum of all array elements 
; >= "lower" value (3) and <= "higher" value (8). 

INCLUDE Irvine32.inc 

.data 
sum DWORD ?    ; EAX - holds sum of included integers 

lower DWORD 3   ; holds lower value 
upper DWORD 8   ; holds higher value 

;Update (2017-11-13) 
index DWORD 0   ; holds index for array 
;============== 
loopCounter DWORD ?  ; ESI - holds loop array pointer 
includedCounter DWORD ? ; EDX - holds 'included' counter 

array DWORD 3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3,8,4 ; values checked 
arraySize = ($ - array)/TYPE array     ; [current location lounter ($) - array/DWORD] = 20 

.code 
main PROC 
mov eax, sum 
mov ebx, lower 
mov ecx, upper 
mov edx, includedCounter 

.WHILE loopCounter < arraySize  ; While loopCounter is less than 20 
     ;Update (2017-11-13) 
     mov esi, index 
     ;=============== 
     .IF (array[esi] >= ebx) && (array[esi] <= ecx) 
     add eax, array[esi] 
     inc includedCounter 
    .ENDIF 
    ;Update (2017-11-13) 
    add index, 4 
    inc loopCounter 
    ;================ 
.ENDW 

; Display values 
mov sum, eax 
mov eax, sum 
call WriteInt 
call CrLF 

mov eax, includedCounter 
call WriteInt 
Call CrLF 

; Exit program 
call WaitMsg 

    exit 
main ENDP 
END main 
+1

'ESI'를 증가시키는 코드 부분은 무엇입니까? –

+0

ESI가 배열의 값을 가리 키도록 배열에 추가되면 배열의 다음 값을 가리 키기 위해 ESI를 증가시켜야합니다. 맞습니까? – Robert

답변

0

귀하의 의견은 (과 코드에서) 당신이 loopCounter을 증가하는 것은 어떻게 든 자동으로 ESI를 증가 것이라고 생각하는 것이 좋습니다. 사실, 이들은 서로 다른 엔티티입니다 (하나는 레지스터이고 다른 하나는 메모리에있는 위치 임). 따라서이 "자동 증가"는 발생하지 않습니다. (사실, 어셈블리 코드에서 "자동으로"아무것도 발생하지 않는 경우가 종종 있습니다.)

+0

좋아, 색인 변수를 추가하고 0으로 설정합니다. 그런 다음 각 .IF 루프가 끝난 후 인덱스에 4를 추가하면 이제는 대답이 정확합니다. – Robert

+0

.IF는 루프가 아닙니다. –