Суммирование массива в сборке x86. По введенным индексам

У меня возникли проблемы с добавлением массива, но по введенным индексам. Например, пользователь вводит 4 в качестве начального и 6 в качестве конечного массива, поэтому мне придется перебрать массив [4] в массив [6] и добавить числа включительно. Я не уверен, смогу ли я использовать свой массив в .data в моей процедуре ArraySum. Должен ли я как-то впихнуть его в процедуру?

Для этого я использую внешнюю библиотеку Кипа Ирвина.

Мой код здесь:

 TITLE Assignment 7

    INCLUDE Irvine32.inc


.data
str1 BYTE "The array sum is:    ",0
start BYTE "Enter the Starting Index:  ",0
endinx BYTE "Enter the Ending Index:    ",0

array DWORD 4, 6, 2, 5, 6, 7, 8, 4
sum DWORD ?
j DWORD ?
k DWORD ?

.code
main PROC
    mov esi, OFFSET array
    mov ecx, LENGTHOF array

    mov edx, OFFSET start
    call WriteString
    call ReadInt
    mov j, eax
    mov esi, j


    mov edx, OFFSET endinx
    call WriteString
    call ReadInt
    mov k, eax
    mov ecx, k

    call ArraySum
    mov sum,eax
    call WriteInt

main ENDP

;---------------------------------------------------
ArraySum PROC
;sums an array falling within j..k inclusive
;---------------------------------------------------
    push esi
    push ecx

    mov eax, 0
L1:
    add eax, array[esi]
    add esi, TYPE DWORD
    loop L1

    pop ecx
    pop esi
    ret

ArraySum ENDP

END main

person binaryhex    schedule 23.04.2015    source источник


Ответы (1)


У вас не должно возникнуть проблем с доступом к array из ArraySum, но кажется, что код цикла неверен. Инструкция loop label уменьшает значение регистра ecx и переходит к метке, если ecx не равно нулю. Также array содержит DWORD, что означает, что при доступе к его элементам вы должны умножить индекс на 4. В целом код для цикла должен быть примерно таким:

   ;; array max_index in ECX, i.e. length-1
    push ebx
    mov ebx, offset array
    xor  eax, eax                      ; sum = 0
    xor  esi, esi                      ; index = 0
L1:                                    ; do {
    add eax, dword ptr [ebx + esi * 4]  ; sum += array[idx] scaled index addressing
    inc esi
    cmp esi, ecx
    jle L1                             ; }while(i <= max_idx)

    pop ebx
   ; EAX = sum of array[0 .. ecx*4]
person ryusev    schedule 23.04.2015