x86 程序集:在尝试访问不可访问的内存位置后,对输入值求和然后求平均值的程序崩溃

x86 Assembly: Program to sum input values and then average them is crashing after trying to access a memory location that is not accessible

我有一项学校作业让我很困惑。程序是读入数值,传入数组,求和,取平均值。

.DATA
inputArray  DWORD 100 DUP(?)
elementCnt  DWORD 0
number      DWORD ?
prompt      BYTE  "Enter values. (-1 to quit) ", 0
string      BYTE  40 DUP (?)
resultLbl   BYTE  "The sum is", 0
sum         BYTE  11 DUP (?), 0

.CODE
_MainProc PROC
    mov  eax, 0                    ; EAX = 0
    lea  ebx, inputArray           ; EBX = [inputArray]
    mov  ecx, elementCnt           ; ECX = 0

getInputs:
    input prompt, string, 40      ; Get input from the user
    atod  string                  ; Convert to decimal, result stored in EAX
    mov   [ebx + (ecx * 4)], eax        ; Move the user input into the array
    add   ecx, 1
    cmp   eax, -1
    jg    getInputs

    mov  eax, 0

    mov  eax, 0                    
    lea  ebx, inputArray           
    mov  ecx, elementCnt          

    push ebx
    push eax
    call sumAndAverage

quit:
    mov  eax, 0
    ret
_MainProc ENDP

sumAndAverage PROC
    push ebp
    mov  ebp, esp
    push eax

sumValues:
    add  eax, [ebx + ecx] ; <------ CRASHING HERE 
    loop sumValues

    xor  edx, edx
    idiv ecx

    pop  eax
    pop  ebp
    ret
sumAndAverage ENDP
END

我不是最擅长组装的。这绝对不是我的语言。

input 和 prompt 都是在名为 io.h 的 header 中定义的宏。使用它们的代码部分工作正常。老实说,我知道是什么导致了崩溃,但我不确定。代码崩溃是因为它试图访问不允许访问的内存位置。这意味着我从数组中读取值的代码有问题。

如果有人能在不提供解决方案的情况下向我解释我的问题是什么,我将不胜感激。

看一下这段代码:

sumValues:
    add  eax, [ebx + ecx] ; <------ CRASHING HERE 
    loop sumValues

loop 递减 ecx。由于当您输入 sumAndAverageecx 为零(您应该能够弄清楚这是为什么),因此当您遍历循环时 ecx 变为负数。这会导致 [ebx + ecx] 的有效地址越界。这属于分段错误。