Я застрял в этой программе на некоторое время и не смог понять, в чем проблема.
Я посмотрел здесь и мой учебник для колледжа и не могу найти четкого ответа. Ответы, которые я видел, используют 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