Linux 汇编代码程序出现分段错误
在运行代码时,我不断遇到分段错误。一切都进行得很好,但我似乎无法让它做我想做的事情。该程序要求用户输入3个整数,然后询问用户他们认为这些数字的平均值是多少,考虑到这一点,然后返回用户是否猜对了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: ",
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