【问题标题】:ARM assembly how to print string indexARM汇编如何打印字符串索引
【发布时间】:2020-01-31 15:07:11
【问题描述】:

我已经被这个程序卡住了一段时间,一直无法弄清楚问题出在哪里。

我查看了这里以及我的大学教科书,但找不到明确的答案。我看到的答案使用 C 函数来处理输出,我试图远离 C,因为我真的想了解 Assembly 是如何工作的。

无论如何,下面的程序做了两件事。它做的第一件事是循环 x 次并在每次迭代时将“hello”打印到控制台。这部分程序一切正常

第二部分也是一个循环,但不是打印字符串,我只想打印字符串的索引。

这是我正在尝试做的 C 中的一个示例:

char hello[6] = "Hello";
int len = 6;

for (int i=0; i<len; i++)
{
    printf("%c\n", hello[i]);
}

这是我遇到问题的地方,它根本没有打印任何东西。我已尝试按照以下说明将字符值打印到控制台:MOVLDRLDRB

我知道这可能很简单,感谢任何帮助。

这是代码,我已对所有内容进行了注释以显示“我认为”正在发生的事情:

/* 
 * Program:     String Loop
 *
 * Author:      
 *
 * Date:        1/29/20
 *
 * Purpose:     Learning ARM Assembly Language
 */




.text
.global main

main:

    printString:
        MOV R3, #0      @ Store counter in r3
        MOV R4, #5      @ Max iterations for loop1

        loop1:
            @ Print String
            MOV R7, #4          @ Syscall Write   
            MOV R0, #1          @ Output to monitor
            LDR R2, =len        @ Buffer size
            LDR R1, =message    @ Addr of string 
            SWI 0               @ Interrupt

            ADD R3, R3, #1      @ Incr counter
            CMP R3, R4          @ Compare counter/max iterations
            BLT loop1           @ If counter < max, loop again


    printChar:
        LDR R4, =message        @ Load string addr into r4

        loop2:
            LDRB R5, [R4], #1   @ Get next char of string
            CMP R5, #0          @ See if char is #0
            BEQ exit            @ If so, exit

            @ Print Char
            MOV R7, #4      
            MOV R0, #1      
            MOV R2, #1 
            MOV R1, R5      // Also tried LDR R1, [R5] && LDRB R1, [R5]
            SWI 0    

            B loop2

exit:
    MOV R7, #1
    SWI 0

.data
    message: 
        .ascii "Hello\n"
    len = .-message

.end

【问题讨论】:

  • write 系统调用期望R1 包含要写入的数据的地址。所以这就是你必须给它的。
  • 也不清楚你想做什么。你是什​​么意思“字符串的索引”?
  • @Jester 我用一个我正在尝试做的例子更新了这个问题,谢谢。
  • 在这种情况下,将MOV R1, R5 替换为SUB R1, R4, #1(假设系统调用不会破坏R4)。
  • 没关系@Jester你是对的,谢谢!

标签: assembly raspberry-pi arm


【解决方案1】:
.data
    message1: 
        .ascii "Hello\n"
    len1 = . - message1
    message2:
        .byte 0
    len2 = . - message2
.text
.global _start
_start:
    ldr r0, =message2
    ldr r1, =len2
    ldr r3, =message1
    ldr r4, =len1
    mov r5, #0
    loop$:
        ldr r6, [r3, r4]
        strb r6, [r0]
        bl print
        cmp r5, r4
        addlt r4, #1
        blt loop$
    mov r7, #1
    mov r0, #0
    svc #0
print:
    mov r2, r1
    mov r1, r0
    mov r0, #1
    mov r7, #4
    svc #0
    mov pc, lr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多