Linux 汇编代码程序出现分段错误

Linux 汇编代码程序出现分段错误,linux,assembly,segmentation-fault,nasm,Linux,Assembly,Segmentation Fault,Nasm,在运行代码时,我不断遇到分段错误。一切都进行得很好,但我似乎无法让它做我想做的事情。该程序要求用户输入3个整数,然后询问用户他们认为这些数字的平均值是多少,考虑到这一点,然后返回用户是否猜对了 segment .data ; ; Output strings ; prompt1 db "Enter a positive integer: ", 0 prompt2 db "Enter a second positive integer: ",

在运行代码时,我不断遇到分段错误。一切都进行得很好,但我似乎无法让它做我想做的事情。该程序要求用户输入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
问题似乎就在这里。由于是除数的高阶字,因此必须将edx归零,因此可能会出现除法溢出异常。
如果不是这样,那么问题可能出在一些I/O例程中

问题似乎就在这里。由于是除数的高阶字,因此必须将edx归零,因此可能会出现除法溢出异常。

如果不是这种情况,那么问题可能出在某些I/O例程中

在不知道所使用的编译器的情况下,很难找出问题所在

分段错误在保护模式下出现,当您尝试访问没有权限访问的分段时

在这里声明3个不同的段。在调用
print\u string
之前,必须确保将
ds
寄存器初始化为
.data

read_int
之后,您将数据保存到
input1
变量中,该变量似乎位于与您用于打印消息的段不同的段中,但您没有更改
ds


我不知道您的编译器是如何处理这些段的,因此请提供其文档的链接。

不知道您使用的编译器就很难找出问题所在

分段错误在保护模式下出现,当您尝试访问没有权限访问的分段时

在这里声明3个不同的段。在调用
print\u string
之前,必须确保将
ds
寄存器初始化为
.data

read_int
之后,您将数据保存到
input1
变量中,该变量似乎位于与您用于打印消息的段不同的段中,但您没有更改
ds


我不知道编译器是如何处理这些段的,因此请提供其文档的链接。

请格式化代码,使其在此处可读,并精确指出失败的确切位置。asm已经很难读取了。多亏了digitalRoss,我不确定分段错误发生在哪里,它是在运行时发生的。您提供的代码不包括
read\u int
print\u string
print\u int
print\u nl
例程,这些例程中的任何一个可能都是相关的。如果有多少,程序应该做什么?在它死之前它实际上做了什么?它打印什么吗?是否接受任何用户输入?即使您不能告诉我们是什么指令触发了segfault,您也应该能够从程序在发生故障之前所做的工作中了解到它发生的时间。@yes123:为什么不呢?我认为OP正在学习底层硬件的实际工作原理,这很好。请格式化代码,使其在此处可读,并指出其故障的确切位置。asm已经很难读取了。多亏了digitalRoss,我不确定分段错误发生在哪里,它是在运行时发生的。您提供的代码不包括
read\u int
print\u string
print\u int
print\u nl
例程,这些例程中的任何一个可能都是相关的。如果有多少,程序应该做什么?在它死之前它实际上做了什么?它打印什么吗?是否接受任何用户输入?即使您不能告诉我们是什么指令触发了segfault,您也应该能够从程序在发生故障之前所做的工作中了解到它发生的时间。@yes123:为什么不呢?我认为OP正在学习底层硬件是如何工作的,这很好。我认为这是不可能的。分段错误显然是一个内存处理问题。我认为这是不可能的。分段错误显然是一个内存处理问题。
div ebx