且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

分段故障错误与大会code程序发生

更新时间:2022-10-15 16:47:02

这是不容易查明问题不知道你使用的编译器。

分段故障 hapens在保护模式下,当您试图访问一个段你没有访问权限的。

您在这里声明3 diferent段。你必须确保你的 DS 寄存器初始化为你的。数据段之前调用 print_string

这似乎也是有问题的,经过 read_int 将数据保存到这似乎是一个在输入1 变量不同的细分比您用于打印邮件,但你不改变 DS

我不熟悉你的编译器究竟是如何处理这些段,所以请给一个链接到它的文档。

I keep getting a segmentation fault error when running my code. Everything has compiled well, but I can't seem to get it to do what I want. The program is to ask the user to enter 3 integers, then ask the user what they think the average of the numbers would be, take that into account and then come back with whether or not the user guessed correctly

    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

It is not easy to pinpoint the problem without knowing the compiler you use.

Segmentation fault hapens in protected mode, when you try to access a segment you have no permissions to access.

You declare 3 diferent segments here. You have to make sure your ds register is initialized to your .data segment, before calling print_string.

It also seems problematic that after read_int you save the data to the input1 variable which seems to be in a different segment than that you used for printing the message, but you do not change ds.

I'm not familiar how exactly your compiler handles these segments, so please give a link to its documentation.