【发布时间】: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