2017-09-03 7 views
1

저는 어셈블리에 익숙하지 않고 지난 몇 일 동안 인터넷을 수색하여 도움을 받았지만 아무 소용이 없었습니다.Scanf ARM 어셈블리를 사용하는 세그먼트 오류

.data 

format: .asciz "%s" 
string: .asciz "Output: %s\n" 

prompt: .asciz ">" 

.text 
.global main 
.main: 

    ldr r0, addr_prompt  /*loading address of prompt message in r0*/ 
    bl printf    /*calling printf*/ 

    ldr r0, addr_format  /*loading first parameter of scanf*/ 
    ldr r1, addr_string  /*loading second parameter of scanf*/ 
    bl scanf    /*calling scanf*/ 

    /*below I am trying to print out the user 
    input from scanf*/ 

    ldr r1, [r1]    
    bl printf 

    mov r7, #1 
    swi 0 

addr_prompt: .word prompt 
addr_format: .word format 
addr_string: .word string 

실행하면 "세그먼트 오류"오류가 발생합니다. 누군가 내가 뭘 잘못했는지에 대해 알려 주면 도움이 될 것입니다.

편집 : 코멘트 추가 제안 고정 복사 에러로 코드 (scanf와 -> scanf와 BL)

+1

디버거를 사용하여 다른 사람이 도와주고 싶어요 특히 코드를 주석 처리합니다. 어쨌든,'scanf'는 컴파일되지 않아야합니다. 복사 - 붙여 넣기 오류처럼 보일 것입니다. 아마도 거기에'bl scanf'가있을 것입니다. 실제로 사용하고있는 코드를 알려주십시오. 또한'ldr r1, [r1]'은 의미가 없으며 물론 당신이 원했던 것을 언급하지 않았기 때문에 그것을 고칠 수는 없습니다. 'r1'은 호출자 저장이므로'scanf'는 그것을 파괴 할 것입니다. C에서'scanf'가 어떻게 작동 하는지를 알지 못하는 것 같습니다 (반환 값을위한 버퍼도 넘기지 않았습니다). – Jester

+0

C에서 문자열 등이 작동합니까? 어셈블리 언어 나 함수 호출에 문제가 있습니까? 문제를 반으로 나눕니다. –

+0

'bl scanf'에서 오류가 발생하고'bl printf'가 올바른 출력으로 예상대로 작동합니다 (디버거에서)? 'ldr r0, addr_prompt'에 의해 혼란 스러울지라도 나는'ldr r0, prompt' 만 심볼'prompt'의 주소를로드 할 것이라고 기대할 것입니다,하지만 다시 이것은 ARM 어셈블러 방언이 될 수 있습니다. 아직 알지 못하지만 일부 키워드를 직접로드에 사용해야 할 수도 있습니다. 'addr_prompt : .word prompt'를 통한 당신의 간접적 인 지시는 여전히 중복 될 가능성이 있으며, 왜 당신이 그것을 사용하고 있는지 명확하지 않습니다. – Ped7g

답변

0

버퍼/저장이 입력 데이터를 저장하는 데 필요하다. 라즈베리 파이 Raspbian에서

.data 

format: .asciz "%s" 

string: .asciz "Output: %s\n" 
prompt: .asciz ">" 

storage: .space 80   @ --- added buffer 

.text 
.global main 
main:      @ --- removed . 

    ldr r0, addr_prompt  /*loading address of prompt message in r0*/ 
    bl printf    /*calling printf*/ 

    ldr r0, addr_format  /*loading first parameter of scanf*/ 
    ldr r1, addr_storage @ --- location to write data from input 
    bl scanf    /*calling scanf*/ 

    /*below I am trying to print out the user 
    input from scanf*/ 

    ldr r1, addr_storage @ --- data location 
    ldr r0, addr_string  @ --- printf format 
    bl printf 

    mov r0, #0    @ --- good return code 
    mov r7, #1 
    swi 0 

addr_prompt: .word prompt 
addr_format: .word format 
addr_string: .word string 
addr_storage: .word storage @ --- address of buffer 

출력 :

as -o printf10.o printf10.s 
gcc -o printf10 printf10.o 

./printf10; echo $? 
>Hello 
Output: Hello 
0 
+0

정말 고마워요! 나는 버퍼가 필요하거나 그것을 구현하는 방법을 몰랐다. 단지 몇 가지 추가 설명과 이해를 위해; '.space' 다음에 오는'80'은 무엇을 의미합니까? –

+0

버퍼 길이는 80 자입니다. – bstipe