微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

READ Syscall 输出在哪里,在哪里可以找到文档?

如何解决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 举报,一经查实,本站将立刻删除。