我目前在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段部分。任何幫助深表感謝。謝謝!
你看過[this?](http://infocenter.arm.com/help/topic/com.arm.doc.dui0348c/Cacjcjce.html?resultof=%22%61%6c%69%67% 6e%22%20) –
'.comm字,4,4'只打算分配4個字節。非常適合指針,但是如果字符串更長,它可能會崩潰。嘗試'.space 128'並使用比'word'更好的名字;像'userString'。您總是可以省略* al *,只需輸入代碼'b skip'。另外,您可以保存所有寄存器的入口和出口'stmfd sp !, {r4-r12,lr}'和'ldmfd sp!,{r4-r12,pc}'。你的彙編程序不使用它們,但'C'代碼可能...我不認爲這是你的問題。 –
它可能有助於告訴我們事情是如何工作的。彙編程序是否抱怨?代碼崩潰了嗎?它在哪裏崩潰?等等 – doron