Ошибка сегментации, происходящая с программой кода сборки

Я продолжаю получать ошибку ошибки сегментации при запуске моего кода. Все скомпилировано хорошо, но я не могу заставить его делать то, что я хочу. Программа состоит в том, чтобы попросить пользователя ввести 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, так как это старшее слово делителя, так что, вероятно, вы получаете что-то вроде исключения переполнения при делении.
Если это не так, возможно, проблема в некоторых из ваших процедур ввода-вывода

Другие вопросы по тегам