2016-01-03 21 views
0

因此,我是ARM彙編程序的初學者。 「!你好,世界」 我試圖返回的長度,因此它必須是13.這是我的源代碼:當我想在樹莓派的ARM彙編程序中返回字符串長度時獲取段錯誤

.section .rodata 

.align 2 

message: 

.string "Hello, world!" 

afficher: 

     .string "%d" 

     .text 
     .align 2 
     .global main 
long: 

     stmfd sp!, {lr} 
     ldrb r2, [r0] 
     cmp  r2, #0 
     beq  out 
     add  r1,r1,#1 
     add  r0,r0, #1 
     bl  long 
     ldmfd sp!, {lr} 
     bx  lr 
     .global main 

main:       

     stmfd sp!, {lr} 
     ldr  r0, =message  
     mov  r1, #0 
     bl  long 
     ldmfd sp!, {lr} 
     bx  lr 

out : 

     ldr  r6, =message 
     bl  printf 
     mov  r0, r1  
     ldr  r3, =afficher 
     mov  r4, r1 
     mov  r5, r0 
     bl  printf 
     .global main 

我不知道在哪裏誠實的問題。任何人都可以幫助我嗎?!感謝名單

+0

Wowzers,我從來沒有見過'strlen'實現_recursively_之前......無論如何,首先要在調試器下運行它以找到_where_ segfault發生,以及被訪問的地址是否顯然是無意義的(建議數據腐敗)或接近合理的東西(暗示某種超限)。 – Notlikethat

+0

你確定你的字符串是0終止的嗎? – JimmyB

+0

是的,它是0終止的。我試圖在主標籤中調用printf,但是我仍然有段錯誤 – Adil

回答

0

所以,經過進一步查找到我的代碼,這裏是一個工作代碼:

.section .rodata  
.align 2     

message:       
    .string "Hello, world!" 

print: 
    .string "Length is : %d\n" 

.text     
.align 2 
.global main    

strlen: 
    stmfd sp!, {lr} 
    ldrb r2, [r0] 
    cmp  r2, #0 
    beq  out 
    add  r1, r1, #1 
    add  r0, r0, #1 
    bl  strlen 
    ldmfd sp!, {lr} 
    bx  lr 
    .global main 

main:       
    stmfd sp!, {lr}  
    ldr  r0, =message  
    mov  r1, #0 
    bl  strlen 
    ldmfd sp!, {lr} 
    bx  lr 
out: 

    stmfd sp!, {lr} 
    ldr  r0, =print 
    mov  r3, r1 
    bl  printf 
    ldmfd sp!, {lr} 
    bx  lr 

起初,我正在給一個「你好,世界\ n!」字符串來計算長度,因爲它返回了14,但沒有「\ n」它返回13. 感謝您的幫助,並歡迎任何其他關於此代碼的變體,如果您還有任何!

相關問題