【发布时间】:2013-10-15 21:44:26
【问题描述】:
我目前正在学习 CS 课程,并且我们刚刚开始在 Raspberry Pi 上使用 ARM Assembly。事实证明这是相当困难的,并且想知道是否有人可以提供帮助。我目前的任务是从标准输入(使用scanf)获取一个字符串并计算其中的字符数,然后返回该数字(所以基本上实现我自己的strlen)。我对这段代码有基本的想法:
.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?
-
.comm word,4,4只会分配 4 个字节。非常适合指针,但如果字符串更长,它可能会崩溃。尝试.space 128并使用比word更好的名称;喜欢userString。您可以始终省略 al,而只需编码b skip。此外,您可以在进入和退出stmfd sp!, {r4-r12,lr}和ldmfd sp!, {r4-r12, pc}时保存所有寄存器。您的汇编程序不使用它们,但是“C”代码可能...不过我认为这不是您的问题。 -
这可能会有所帮助,因此请告诉我们事情是如何不工作的。装配工在抱怨吗?代码崩溃了吗?它在哪里崩溃?等