2011-03-19 6 views
1

코드 실행 중 세그먼트 오류가 계속 발생합니다. 모든 것은 잘 정리되어 있지만, 원하는대로 할 수는 없습니다. 이 프로그램은, 그때 그들은 숫자의 평균 될 것이라고 생각하는 사용자에게, 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

왜 어셈블리 – dynamic

+0

코드를 여기에서 읽을 수 있도록 포맷하고 실패한 정확한 위치를 정확하게 지적하십시오. asm은 그대로 읽을 정도로 어렵습니다. – Mat

+0

digitalRoss에게 감사드립니다. 세분화 오류가 발생한 위치가 확실하지 않습니다. 실행될 때 발생합니다. – BDilly

답변

0
div ebx 
추측 여부로 돌아올 것입니다

문제가 여기에있는 것 같습니다. 제 곱수의 상위 단어이므로 edx를 제로화해야합니다. 따라서 디비전 오버 플로우 예외가 발생했을 것입니다.
그렇지 않은 경우 일부 I/O 루틴에 문제가있는 것 같습니다.

+0

나는 그것이 가능하다고 생각하지 않는다. 분할 오류는 분명히 메모리 처리 문제입니다. – vbence

1

사용하는 컴파일러를 모른 채 문제를 정확하게 지적하는 것은 쉽지 않습니다.

세그먼트 오류 보호 모드에서 세그먼트에 액세스하려고하면 액세스 권한이 없습니다.

여기서 세 가지 다른 세그먼트를 선언합니다. print_string에 전화하기 전에 ds 레지스터가 .data 세그먼트로 초기화되어 있는지 확인해야합니다.

또한 read_int 후 메시지를 인쇄에 사용되는 것과 다른 세그먼트에있는 것으로 보인다 input1 변수에 데이터를 저장하지만 ds을 변경하지 않는 것이 문제가 보인다.

컴파일러가이 세그먼트를 얼마나 정확하게 처리하는지 익숙하지 않으므로 해당 문서에 대한 링크를 제공하십시오.

관련 문제