assembly - 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
解决方案
.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
推荐阅读
- python-3.x - 如何使用 TFIDF 创建嵌入矩阵?
- visual-studio-code - 在扩展的任务中调用用户定义的输入
- sql - 使用多个表并以 ID 引用的 SQL 模式名称
- sql - Oracle SQL 列表间隔
- go - 使用 sqlmock 进行单元测试时在 INSERT 上出现错误“不期望查询”
- node.js - 在 hyperleger 结构中向一个组织管理员发送消息给另一个组织管理员
- reactjs - 使用 Redux Hooks 而不是 connect() 好的设计吗?
- javascript - 如何在警报中显示“允许来自...的对话框将您带到他们的标签”?
- java - 如何在 Spring Boot Rest api 响应的 ResponseEntity 中添加自定义属性
- android - 为“.aar”文件Android Studio中编写/定义的活动类获取运行时“java.lang.NoClassDefFoundError”