4

我目前正在上 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 部分,因为(我假设)这不是对齐字符串的正确方法。任何帮助深表感谢。谢谢!

4

2 回答 2

1

我认为您的零件有问题scanf

您需要scanf(在 r1 中)提供字符串输入需要去的地址。要获得的大内存将来自堆栈。由于 ARM ABI 使用完整的降序堆栈,因此您从当前堆栈指针中减去所需的字节数,只需确保这是字对齐的。然后,您可以将新的 sp 复制到 r1,然后在 scanf 中使用。

您可能不需要数据部分中的 addr 内容。您可能需要指定您的代码进入文本部分,并且没有什么能阻止您将所有只读数据也放入文本部分。如果您使用 PC 相对地址,这将非常有帮助。

希望这会有所帮助。

于 2013-10-16T14:40:18.203 回答
1

为什么不写一个 C 程序做同样的事情,然后运行

gcc -S file.c

您将在 file.s 中看到编译器如何处理它(由 gcc 生成的汇编代码)。即使您不了解 file.s 中的某些行,它也会引导您找到 arm 汇编手册的正确位置。

这不是您问题的直接答案。但很遗憾我不能评论你的帖子,否则我会这样做。

于 2013-10-16T14:21:47.357 回答