我有一項讓我難住的學校作業。該程式是讀入值,將它們傳遞到陣列中,對這些值求和,然后對它們求平均值。
.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 的頭檔案中定義的宏。使用它們的代碼部分作業正常。老實說,我對可能導致崩潰的原因有所了解,但我不確定。代碼崩潰是因為它試圖訪問不允許訪問的記憶體位置。這意味著我從陣列中讀取值的代碼有問題。
如果有人可以在不提供解決方案的情況下向我解釋我的問題是什么,我將不勝感激。
uj5u.com熱心網友回復:
看一下這部分代碼:
sumValues:
add eax, [ebx ecx] ; <------ CRASHING HERE
loop sumValues
loop遞減ecx。由于ecx在您輸入時為零sumAndAverage(您應該能夠弄清楚為什么會這樣),因此ecx在您遍歷回圈時變為負數。這會導致 的有效地址[ebx ecx]越界。這屬于分段錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347873.html
