ARM程序集:stdin,stdout,register和program / OS interaction

时间:2018-03-18 19:12:34

标签: assembly arm stdout stdin

这是为Raspberry Pi组装的。 我不确定我是否理解程序使用的寄存器如何与操作系统交互,以及键盘缓冲区如何与想要访问输入字符串的程序相关联。 我举了一个试图解释的例子,试图表达我目前的理解(误导或缺乏);这个例子使用stdin和stdout进行读写:

@receive input via stdin (keyboard)
ldr R1,=msg @address to receive input
mov R2,#20 @maximum number of characters to receive
mov R0,#0 @stdin
mov R7,#3 @read
svc 0 @call linux

所以这要求linux从stdin读取。 R0和R7指定stdin并且程序想要读取,svc 0然后要求linux执行此操作。我不确定为什么R2保持"最大字符数"价值 - 评论是我的,但是基于我见过的其他例子,这似乎有这个"最大的特征"部分 - 。我假设R1将保存消息存储位置的地址(从键盘缓冲区传输?)。接下来的几行代码是:

@echo output, one character at a time, with a newline after each character
    mov R4,R0 @number of characters input
    mov R5,R0 @copy to test for input
    mov R2,#1 @display one character at a time
    mov R0,#1 @stdout
    mov R7,#4 @write
inloop: swi 0 @call linux
    add R3,R1,#1 @save address of next byte to be displayed
    ldr R1,=newln @character skips to newline
    swi 0 @call linux
    mov R1,R3 @restore pointer to message being displayed
    subs R4,#1 @decrement number of characters remaining
    bgt inloop @continue loop until message complete

    .data
msg: .ds 10 @memory buffer for keyboard input
newln: .ascii "\n" @newline character

R0,之前设置为通知linux我想使用stdin,现在包含一个整数,指定输入的字符数(包括换行符)。 R2,以前包含一个整数值,指定 - 我认为 - 可以接受的最大字符数,现在似乎指定了要写入的字符数。

R0现在用于表示stdout,R7指定写入,然后svc 0调用linux。 R3是R1 + 1;因此,我认为这意味着R1是从输入接收的第一个字符的地址,R3将指向下一个字符。 R1切换到指向换行符,linux调用写入,R1切换回指向消息,但是在第二个字符处(因为它从R3接收数据)。如果有更多可用字符,则循环继续(R4在此处充当传统计数器)。

似乎某些寄存器在与操作系统交互时执行某些角色。某些寄存器可以是"活动组件":他们可以要求linux使用stdin和stdout执行某些操作,例如读取或写入。例如,可以为它们分配整数值,然后由服务调用使用它们来标识服务调用必须执行的操作;例如将(特定)寄存器0和7分别设置为0和3,告诉linux该程序想要从stdin读取。在读取时,R2似乎指定了可以接受的字符数,R1是指向应存储字符的位置的指针。写入时,R2告诉linux要写入多少个字符,而R1是指向第一个字符的指针(尽管不一定是字符串中的第一个字符)。

寄存器也可以是"被动组件":从linux接收输入。例如,一旦调用read,R0就会包含一个整数值,用于标识从stdin接收的字符数。

这是否准确无误?我也对stdin如何工作感到困惑:似乎有一个键盘缓冲区,但字符串被转移到其他地方?

0 个答案:

没有答案