Ошибка сегментации, происходящая с программой кода сборки
Я продолжаю получать ошибку ошибки сегментации при запуске моего кода. Все скомпилировано хорошо, но я не могу заставить его делать то, что я хочу. Программа состоит в том, чтобы попросить пользователя ввести 3 целых числа, затем спросить пользователя, каково, по его мнению, среднее число чисел, принять это во внимание и затем узнать, правильно ли угадал пользователь.
segment .data
;
; Output strings
;
prompt1 db "Enter a positive integer: ", 0
prompt2 db "Enter a second positive integer: ", 0
prompt3 db "Enter a third positive integer: ", 0
prompt4 db "Enter a guess of their average: ", 0
outmsg1 db "You entered ", 0
outmsg2 db " and ", 0
outmsg3 db " and ", 0
outmsg4 db "You guessed that the average is ", 0
outmsg5 db "You did you guess correctly? (0 = no, 1 = yes)", 0
avermsg db "The average of the numbers is ", 0
segment .bss
input1 resd 1
input2 resd 1
input3 resd 1
input4 resd 1
guess resd 1
segment .text
Global main
main:
enter 0,0 ; setup routine
pusha
mov eax, prompt1 ; print out prompt1
call print_string
call read_int ; read integer
mov [input1], eax ; store integer into input1
mov eax, prompt2 ; print out prompt2
call print_string
call read_int ; read integer
mov [input2], eax ; store integer into input2
mov eax, prompt3 ; print out prompt3
call print_string
call read_int ; read integer
mov [input3], eax ; store integer into input3
mov eax, prompt4 ; print out prompt4
call print_string
call read_int ; read integer
mov [guess], eax
mov eax, [input1] ; eax = dword at input1
add eax, [input2] ; eax += dword at input2
add eax, [input3] ; eax += dword at input3
mov ebx, 3
div ebx ; divides the sum by 3
mov ecx, eax ; freeing up eax, puts quotient into ecx
dump_regs 1 ; print out register values
; next print out results
mov eax, outmsg1
call print_string ; print out first message
mov eax, [input1]
call print_int
mov eax, outmsg2
call print_string ; print out second message
mov eax, [input2]
call print_int
mov eax, outmsg3
call print_string ; print out thrid message
mov eax, [input3]
call print_int
mov eax, outmsg4
call print_string ; print out fourth message
mov eax, [input4]
call print_int
xor ebx, ebx
cmp ecx, [guess]
sete bl
neg ebx
mov edx, ebx
and ecx, edx
not ebx
and ebx, [guess]
or edx, ebx
mov eax, outmsg5
call print_string
mov ecx, eax
call print_int
mov eax, [avermsg]
call print_string ; print out final message
mov ecx, edx
call print_int ; print out average of ebx
call print_nl ; print new line
popa
mov eax, 0 ; return back to C
leave
ret
2 ответа
Нелегко точно определить проблему, не зная компилятор, который вы используете.
Ошибка сегментации происходит в защищенном режиме, когда вы пытаетесь получить доступ к сегменту, у вас нет прав доступа.
Вы объявляете 3 разных сегмента здесь. Вы должны убедиться, что ваш ds
регистр инициализирован к вашему .data
сегмент, перед звонком print_string
,
Также кажется проблематичным, что после read_int
Вы сохраняете данные в input1
переменная, которая, кажется, находится в другом сегменте, чем та, которую вы использовали для печати сообщения, но вы не меняете ds
,
Я не знаю, как именно ваш компилятор обрабатывает эти сегменты, поэтому, пожалуйста, дайте ссылку на его документацию.
div ebx
проблема, кажется, здесь. Вы должны обнулить edx, так как это старшее слово делителя, так что, вероятно, вы получаете что-то вроде исключения переполнения при делении.
Если это не так, возможно, проблема в некоторых из ваших процедур ввода-вывода