ARM сборка как печатать индекс строки - PullRequest
0 голосов
/ 31 января 2020

Я застрял в этой программе на некоторое время и не смог понять, в чем проблема.

Я посмотрел здесь и мой учебник для колледжа и не могу найти четкого ответа. Ответы, которые я видел, используют C функции для обработки вывода, я стараюсь держаться подальше от C, потому что я действительно хочу понять, как работает Assembly.

В любом случае, программа ниже делает 2 вещи. Первое, что он делает, это l oop x количество раз и выводит «hello» на консоль каждую итерацию. В этом разделе программы все работает нормально

Вторая часть также al oop, но вместо печати строки я хочу напечатать только индекс строки.

Это пример из 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

1 Ответ

0 голосов
/ 05 марта 2020
.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
...