【问题标题】:How would you write to stdout from a bytecode interpreter?您将如何从字节码解释器写入标准输出?
【发布时间】:2015-07-22 21:01:55
【问题描述】:

我正在阅读有关构建简单虚拟机/字节码解释器的教程。它有 PUSH、POP、HALT 等指令……这些指令在开关中被解码和评估,所以你会说如果当前指令等于 PUSH,那么你会将它推入堆栈。但是如果我想打印一个字符串或字符呢?

在汇编中,您将使用在.data 中创建一个字符串,推送长度,然后是消息,然后是 stdout (1) 的文件描述符,系统写入调用号 so 4(对于 32 位),然后做int 80。

我如何为虚拟机做这样的事情?我会以同样的方式处理它吗?我想也许我可以把我想写的任何东西都转储到一个寄存器中,然后当其中包含(幻数)以外的内容时 printf 内容,但这似乎不是一个好主意。

【问题讨论】:

  • 你认为'int 80'有什么作用?
  • @Soren 不确定,我认为是系统调用??
  • 那么您认为该系统调用会发生什么?
  • 它可能会将您推送的内容发送到系统?并且文件描述符说将其写入标准输出?我不太确定。
  • 我想这取决于您的“VM”/字节码解释器的底层程度。如果我将其中一个作为普通 C 程序编写,在操作系统下运行,我会定义一个操作码,意思是“putchar”,它会从堆栈中弹出一个单词并在其上调用常规的旧 putchar(),并且角色会出现在我的屏幕上。

标签: c virtual-machine stdout bytecode


【解决方案1】:

“打印”假设具有某种 IO(输入/输出)系统,其输出设备能够在其上呈现数据(作为打印机或显示器)。在虚拟机上,这样的设备也只能是虚拟的,如何模拟它取决于 VM 实现。例如,它可以有一个明确定义的特定内存范围,即“视频内存”,这样写入那里就被解释为向输出设备发送数据,可以通过虚拟机界面中的文本框来模拟。

【讨论】:

  • 嗯,谢谢。但是有一个问题,是否有任何典型的方法可以解决这个问题?我不想“重新发明轮子”。
  • 显存是很常见的东西。您必须将显示的数据存储在某处,对吗?除非它是某种串行设备,例如电传打字机或其他东西,您一次只发送一个字符“忘记”前一个字符。在这种情况下,您可以只有几个控制寄存器,或者内存映射,或者端口映射(例如在 x86 中)。
  • 谢谢!我会看看这些。
【解决方案2】:

您需要为程序创建一种访问屏幕的方式——它们不能“自动”访问。

例如(正如 Eugene Sh. 的评论所建议的):创建一个 PUTCHAR 操作码,它从堆栈中弹出一个数字并将其打印到屏幕上(使用普通 C 函数 putchar)。

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多