运行我的代码时,我不断收到分段错误错误。 一切都编好了,但我似乎无法得到它做我想要的。 该程序是要求用户input3个整数,然后询问用户他们认为数字的平均值是多less,考虑到这一点,然后回来用户是否正确猜测
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
不知道你使用的编译器,找出问题并不容易。
当您尝试访问您没有权限访问的细分受众群时, 细分受到了保护模式的影响。
你在这里声明3个不同的段。 在调用print_string
之前,您必须确保您的ds
寄存器已初始化为.data
段。
这似乎也有问题,在read_int
之后,您将数据保存到input1
变量,该变量看起来与您用于打印消息的段不同,但不会更改ds
。
我不太清楚你的编译器如何处理这些段,所以请给出一个链接到它的文档。
div ebx
这个问题似乎在这里。 你必须把edx归零,因为is是除数的高位字,所以可能你得到了一个分区溢出异常。
如果情况并非如此,那么问题可能出在你的一些I / O例程上