2015-04-23 98 views
1

Im在添加数组时遇到了一些问题,但在输入的索引上。例如,用户输入4作为开始,6作为结束数组,所以我将不得不遍历数组[4]到数组[6]并且包含数字。我不确定我是否可以在ArraySum过程的.data中使用我的数组。我是否必须以某种方式将它推入程序?在汇编x86中汇总数组。在输入的索引

我正在使用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 

回答

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