2013-10-15 120 views
3

我目前在CS課程中,我們剛剛開始與Raspberry Pi上的ARM彙編工作。這證明是非常困難的,並想知道是否有人可以提供幫助。我目前的任務是從stdin(使用scanf)取一個字符串並計算它中的字符數,然後返回該數字(所以基本上實現我自己的strlen)。我的基本思路來與此代碼:原位缺口對齊字符串的正確方法ARM彙編:從STDIN獲取字符串

.section  .rodata 
promptWord: 
    .ascii "Enter a word: \000" 

readWord: 
    .ascii "%s\000" 

printLength: 
    .ascii "Word length is %d characters.\n\000" 

.section .data 
    .align 2 

    .comm word,4,4 
    .text 

addrword: .word word 
addrPromptWord: .word promptWord 
addrReadWord: .word readWord 
addrPrintLength: .word printLength 



    .global main 
            /* s: r0 */ 

main: 
    stmfd sp!, {fp, lr}  /* Save pc, lr, r4*/ 

    ldr r0, addrPromptWord 
    bl printf 

    ldr r0, addrReadWord 
    ldr r1, addrword 
    bl scanf 

    ldr r0, addrword 
    ldr r0, [r0] 

    mov r1, #0 
skip: 
    ldrb r2,[r0]     /* r2 <- *a */ 
    mov  r3,#0 
    cmp  r2,r3 
    beq  endskip     /* if (*a == 0) jump endskip */ 
    mov  r3,#1 
    add  r0,r0,r3    /* a++ */ 
    add  r1, r1, r3    /* len++ */ 
    bal  skip     /* go to skip */ 

endskip: 
    mov r0, r1      /* Return len */ 

    ldmfd sp!, {fp, pc} 

我假設的問題是與因爲(我假設)的代碼.data段部分。任何幫助深表感謝。謝謝!

+0

你看過[this?](http://infocenter.arm.com/help/topic/com.arm.doc.dui0348c/Cacjcjce.html?resultof=%22%61%6c%69%67% 6e%22%20) –

+1

'.comm字,4,4'只打算分配4個字節。非常適合指針,但是如果字符串更長,它可能會崩潰。嘗試'.space 128'並使用比'word'更好的名字;像'userString'。您總是可以省略* al *,只需輸入代碼'b skip'。另外,您可以保存所有寄存器的入口和出口'stmfd sp !, {r4-r12,lr}'和'ldmfd sp!,{r4-r12,pc}'。你的彙編程序不使用它們,但'C'代碼可能...我不認爲這是你的問題。 –

+0

它可能有助於告訴我們事情是如何工作的。彙編程序是否抱怨?代碼崩潰了嗎?它在哪裏崩潰?等等 – doron

回答

1

爲什麼不寫一個C程序做同樣的事情,並運行

gcc -S file.c 

,你將看到如何在file.s編譯器處理它(與gcc生成的彙編代碼)。即使你做不了解file.s中的某些行,它會將您引導至正確的手臂裝配位置。

這不是直接回答你的問題。但傷心我不能評論你的帖子,否則我會這麼做。

1

我覺得你在scanf部分有問題。

您需要提供scanf(在r1中)以及字符串輸入需要去的地址。要獲得的內存大將來自堆棧。由於ARM ABI使用完全遞減的堆棧,因此可以從當前堆棧指針中減去所需的字節數,只需確保這是字對齊的。然後您可以將新的sp複製到r1,然後在scanf中使用它。

你可能不需要addr的東西在你的數據部分。您可能需要指定您的代碼進入文本部分,並且沒有什麼能阻止您將所有隻讀數據放入文本部分。如果您使用PC相對地址,這將非常有用。

希望這可以幫助。