1

因此,我的目标是编写一个子例程,该子例程在调用时会挂起,直到用户输入以 结尾的字符串<return>,然后返回(可能通过将其写入用户指定的地址)。

我的问题在于如何最好地从键盘上获取单个字符。在我看来,有3种方法:

  1. 聆听来自键盘的中断并让角色响应这些中断。这意味着由 执行的逻辑getline将在中断处理程序中,这似乎会导致一些问题。即,您如何getline响应<return>按键返回?在中断处理程序中,您没有方便的返回地址。在我看来,在中断处理程序中放置太多特定逻辑的模式......错误......即使我在低级编码方面非常缺乏经验。

  2. 只需继续拉动键盘即可进行按键操作。

  3. 通过将所有按下的字符加载到循环缓冲区(可能长度为 1)中,使用中断处理程序实现旧的 1.1 行为。

对这些选项有更多的看法会很好。

4

1 回答 1

1

当您调用时,getline它应该设置中断处理程序,以便将键入的键添加到缓冲区并更新索引

然后开始一个繁忙的循环,直到缓冲区的末尾有一个新行并禁用键盘的中断

getline: 
set push B
set push X
;--coming from interrupt dispatch
SET B, buffer ;--address from argument
SET C, bufferlength ;-- from argument
SET PUSH, 0
SET X, SP ;--address of counter
SET A, startKeyInput
INT softwareInterrupt

IAQ 1;--restart interrupts
startloop:
SET A,buffer
ADD A,SP
IFN [A],'\n'
    set PC, startloop ;--busy loop
IFL PEEK, X
    set PC, startloop ;-- stopping buffer overflow
IAQ 0;--stop interrupts
set A, stopKeyInput
INT softwareInterrupt

SET C,POP;-- C is return value
SET X,POP
SET B,POP
FRI ;-- from interrupt

并且中断处理程序将键入的键添加到缓冲区直到它已满并向计数器添加 1,这可以放在中断处理程序本身中,但您需要在繁忙循环中重新激活中断

于 2012-05-26T20:33:22.433 回答