我在添加数组但在输入的索引上遇到麻烦。例如,用户输入4作为开始数组,输入6作为结束数组,因此我将不得不遍历array [4]到array [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
您从ArraySum访问array
应该没有问题,但是似乎循环代码是错误的。 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]