【问题标题】:ARM Assembly: Getting a string from STDINARM 程序集:从 STDIN 获取字符串
【发布时间】: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”代码可能...不过我认为这不是您的问题。
  • 这可能会有所帮助,因此请告诉我们事情是如何不工作的。装配工在抱怨吗?代码崩溃了吗?它在哪里崩溃?等

标签: c assembly arm


【解决方案1】:

我认为您在使用 scanf 部分时遇到了问题。

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

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    gcc -S file.c
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2021-06-26
      • 2017-08-05
      • 1970-01-01
      • 2011-05-31
      • 2012-02-17
      相关资源
      最近更新 更多