首页 > 解决方案 > ARM汇编如何打印字符串索引

问题描述

我已经在这个程序上停留了一段时间,并且无法弄清楚问题所在。

我看过这里以及我的大学教科书,但找不到明确的答案。我看到的答案使用 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]);
}

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

我知道这可能是非常简单的事情,任何帮助表示赞赏。

这是代码,我已经评论了所有内容以显示“我认为”正在发生的事情:

/* 
 * 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

标签: assemblyraspberry-piarm

解决方案


.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

推荐阅读