以下代码用于查找小于1000的所有数字的总和,它们是3或5的倍数。(项目Euler第一个问题)。
然而,当我执行它时会出现分段错误。 我有一种感觉,它可能与我的检查功能返回后有关,我将ebx从堆栈弹出,然后再添加8到esp以恢复堆栈帧。这是真的,如果是这样,我该怎么做才能解决它?
section .data
section .text
msg: db "%d", 0
global main
extern printf
main:
mov ebx, 0
mov ecx, 0
;MAINLOOP
loopstart:
inc ebx
cmp ebx, 999 ;check if we are done
je done ;if we are, exit
push 3
push ebx ;otherwise, check if our number is a multiple of 3
call check
pop ebx
add esp, 8 ;fix stack pointer
cmp eax, 1 ;if it is a multiple, add it to our sum
je true
push 5
push ebx
call check ;otherwise check if multiple of 5
pop ebx
add esp, 8
cmp eax, 1
je true ;if it is, add it to our sum
jmp loopstart
true:
add ecx, ebx
jmp loopstart
done:
push ecx
push msg
call printf
add esp, 8
ret
check:
push ebp
mov ebp, esp
mov eax, [ebp+8]
mov ebx, [ebp+12]
mov edx, 0
div ebx
cmp edx, 0
je multiple
mov eax, 0
pop ebp
mov esp, ebp
ret
multiple:
mov eax, 1
pop ebp
mov esp, ebp
ret
答案 0 :(得分:1)
我已经解决了这个问题 错误发生在我的检查功能中,我正在使用
pop ebp
mov esp, ebp
应该是
mov esp, ebp
pop ebp
我相信在恢复堆栈帧等方面也存在其他一些错误。 这是完整的工作代码:
section .data
section .text
msg: db "%d", 0
global main
extern printf
main:
mov ebx, 0
mov ecx, 0
loopstart:
inc ebx
cmp ebx, 1000
je done
push ecx
push ebx
push 3
call check
add esp, 4
pop ebx
pop ecx
cmp eax, 1
je true
push ecx
push ebx
push 5
call check
add esp, 4
pop ebx
pop ecx
cmp eax, 1
je true
jmp loopstart
true:
add ecx, ebx
jmp loopstart
done:
push ecx
push msg
call printf
add esp, 8
ret
check:
push ebp
mov ebp, esp
mov eax, [ebp+12]
mov ebx, [ebp+8]
mov edx, 0
div ebx
cmp edx, 0
je multiple
mov eax, 0
mov esp, ebp
pop ebp
ret
multiple:
mov eax, 1
mov esp, ebp
pop ebp
ret