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

时间:2021-03-10 00:25:21

标签: assembly raspberry-pi arm raspbian

我目前正在 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 的字符串。跳过它可以正常工作。

0 个答案:

没有答案