2016-09-29 2 views
-1

저는 Assembly에 익숙하며 사용자로부터 숫자를 받기 위해 scanf를 사용하는 프로그램을 만들려고합니다. 그런 다음 "Result : (the number)"를 출력합니다. 코드를 실행할 때 세그먼트 화 오류가 계속 발생합니다.x86_64 AT & T에서 scanf를 호출 할 때 분할 오류가 발생했습니다.

.global main 
mystring: .asciz"input\n" 
formatstring: .asciz" %d" 
resultstring: .asciz "Result: %ld\n" 

main: 
    movq $0, %rax  
    movq $mystring, %rdi 
    call printf 
    call inout 
    movq $0, %rax 
    movq $resultstring, %rdi 
    call printf 
    jmp end 

inout: 
    pushq %rbp 
    subq $8, %rsp 
    leaq -8(%rbp), %rsi 
    movq $formatstring, %rdi 
    movq $0, %rax 
    call scanf 
    popq %rbp  
    ret 


end: 
    movq $0, %rdi 
    call exit 

나는 '입출력'방법에 문제가 의심 : 이것은 내가 지금 가지고 코드입니다. 이 프로그램을 작동시키는 모든 솔루션?

+1

'inout'에서는'rbp'를 설정하지 않고 이전 값을 스택에 넣기 만하면'rbp-8' 메모리에 액세스합니다 (scanf 내부에서 액세스가 발생 함). BTW "계속 세분화 오류가 발생합니다."디버깅을 통해 어느 쪽 명령에서 segfaults인지와 CPU 상태 (레지스터 값, 코드 주소, 스택 내용)를 알 수 있어야합니다. 하지만 그 시점에서 당신은 스스로 물어볼 필요가 없을 것입니다. 아마도'scanf '에 대한'% rsi' 인자가 스스로 가짜 일 것입니다. – Ped7g

+0

그리고'rsp' 값으로'pop % rbp'를 수행하면 scanf 호출 후에'rsp'를 복원하지 않습니다. 또한'rsp'가'scanf' 호출시 정렬되어 있는지 확인해야합니다. 이것을 확인하십시오 : http://cs.lmu.edu/~ray/notes/gasexamples/ (충분히 짧고 어쩌면 4 초 간략하게 보입니다) – Ped7g

+0

비슷한 질문으로 보이는 것에 대한 의견이 있습니다 여기에 : http://stackoverflow.com/questions/39679848/simple-input-to-output-program-in-assembly –

답변

1
당신이 %rbp 레지스터 언급하는이 명령에서

leaq -8(%rbp), %rsi 
하지만 당신은 실제로 그것을 초기화하는 것을 잊었다!

관련 문제