如何解决READ Syscall 输出在哪里,在哪里可以找到文档?
我目前正在 pi(raspbian 32)上的 ARM 汇编学校项目中,我正在测试教授的代码以确保它有效。这是他提供的:
_sInput:
PUSH {r1-r2,lr} @ preserve values for function
MOV r0,#STDIN @ set the input to the console
MOV r7,#READ @ set the syscall to READ
SWI 0 @ make the syscall
POP {r1-r2,lr} @ restore values sent to function
sInputStrStart:
CMP r2,#0 @ memory bounds checker
MOVLE r0,#0 @ if no more characters put null in R1
STRLEB r0,[r1] @ if no more chars store null in array
BLE sInputEnd @ if no more chars exit
LDRB r0,[r1] @ load in the next byte of sent array
CMP r0,#10 @ check for newline character
MOVEQ r0,#0 @ if end put null character in R1
STRB r0,[r1],#1 @ write byte out at end of array 1
SUB r2,r2,#1 @ decrement letter counter
BNE sInputStrStart @ loop until newline
sInputEnd:
MOV pc,lr @ return to calling environment
这是我写的:
.global _start
.equ STDOUT,1
.equ WRITE,4
_start:
LDR r1,=input
MOV r2,#21
BL _sInput
MOV r0,#STDOUT
MOV r7,#WRITE
SWI 0
_end:
MOV r7,#1
SWI 0
.data
input: .space 21
现在是我的问题。首先,READ 系统调用在哪里输出?教授通过暂时将 r1-r2 放在堆栈上来保证它们的安全,但我认为 READ 将输入写入 R1。我正在尝试运行代码,但我似乎无法打印它,这让我相信我没有正确使用输入。如何访问使用 read 存储的信息?
其次,我在网上查找并尝试查找一些文档以及“man syscall”,但无济于事。有什么地方可以告诉我它是如何工作的吗?例如,r0 必须等于 1 才能获得标准输出。我只是通过阅读其他代码就知道了这一点。有什么地方可以告诉我“你在 r0 中为 stdin 放了一个 1,在 r0 中放了一个 2 用于……”?每当我们过去使用任何其他语言进行编程时,查找可以告诉您如何使用特定功能的文档很容易。现在,感觉就像获取受政府保护的超级机密信息。找了一堆半相关的文档,但都是C写的,没用过,没用。
答案:R2,在 sInputStart 中被降低,因为我没有重新初始化它,它打印一个长度为 0 的字符串。跳过它可以正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。