c - ARM 程序集 : Getting a string from STDIN

标签 c assembly arm

我目前正在学习 CS 类(class),我们刚刚开始在 Raspberry Pi 上使用 ARM Assembly。事实证明这非常困难,并且想知道是否有人可以提供帮助。我当前的任务是从 stdin(使用 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 部分,因为(我假设)这不是对齐字符串的正确方法。任何帮助深表感谢。谢谢!

最佳答案

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

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

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

希望对您有所帮助。

关于c - ARM 程序集 : Getting a string from STDIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19391669/

相关文章:

c - 为什么不使用大于 10 位的数字?

c - 如何在 linux 中为 c 程序分配更多的 cpu 和 RAM

assembly - 引导加载程序加载自身而不是内核

assembly - armv7-m 裸机 ldr/str 符号内存

c++ - ARM 程序集 - 访问参数与返回值?

linux - 找不到工具链二进制文件

c++ - OpenCV 与字节数组

c - arm-linux-gnueabi-gcc 找不到库

encoding - 为什么 ARMv7 中的一条指令有多种编码

c - 如何在 Mac OS X 上安装 Pebble SDK