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
。由于当您输入 sumAndAverage
时 ecx
为零(您应该能够弄清楚这是为什么),因此当您遍历循环时 ecx
变为负数。这会导致 [ebx + ecx]
的有效地址越界。这属于分段错误。
我有一项学校作业让我很困惑。程序是读入数值,传入数组,求和,取平均值。
.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
。由于当您输入 sumAndAverage
时 ecx
为零(您应该能够弄清楚这是为什么),因此当您遍历循环时 ecx
变为负数。这会导致 [ebx + ecx]
的有效地址越界。这属于分段错误。