2015-04-23 128 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