在汇编x86中求和数组。在输入的索引上

时间:2015-04-23 03:10:09

标签: arrays assembly x86 masm irvine32

我在输入索引时添加数组时遇到了一些麻烦。例如,用户输入4作为开始,6作为结束数组,因此我必须循环遍历数组[4]到数组[6]并包含数字。我不确定我是否可以在我的ArraySum过程中使用.data中的数组。我是否必须以某种方式将其推入程序?

我正在使用Kip Irvine的外部库。

我的代码在这里:

 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

1 个答案:

答案 0 :(得分:2)

从ArraySum访问array应该没有问题,但似乎循环的代码是错误的。 loop label指令会减少ecx寄存器,如果ecx不为零,它会跳转到标签。此外array包含DWORD,这意味着当您访问其元素时,您应该将索引乘以4。 总的来说,循环的代码应该是这样的:

    push ebx
    mov ebx, offset array
L1:
    add eax, dword ptr [ebx + esi * 4]
    inc esi
    cmp esi, ecx
    jle L1

    pop ebx