您将如何从字节码解释器写入标准输出?
How would you write to stdout from a bytecode interpreter?
我正在阅读有关构建简单虚拟 machine/bytecode 解释器的教程。它有 PUSH、POP、HALT 等指令......这些指令在开关中解码和评估,所以你会说如果当前指令等于 PUSH,那么你会将它压入堆栈。但是,如果我想打印出一个字符串或字符怎么办?
在汇编中,您可以在 .data
中创建一个字符串,推送长度,然后是消息,然后是 stdout (1) 的文件描述符,系统写入调用号 so 4(对于 32 位), 然后执行 int 80.
我该如何为虚拟机做这样的事情?我会以同样的方式处理吗?我想也许我可以把我想写的任何东西都转储到寄存器中,然后在其中包含(幻数)以外的内容时打印内容,但这似乎不是一个好主意。
"Printing" 假设有某种 IO (input/output) 系统,其输出设备能够在其上显示数据(如打印机或显示器)。在虚拟机上,这样的设备也只能是虚拟的,如何模拟它取决于 VM 实现。例如,它可以有一个特定的明确定义的内存范围,即 "video memory",这样在那里写入被解释为将数据发送到输出设备,这可以通过虚拟机界面中的文本框来模拟.
您需要为程序创建一种访问屏幕的方式 - 它们做不到 "automatically"。
例如(如 Eugene Sh. 的评论所建议):创建一个 PUTCHAR 操作码,它从堆栈中弹出一个数字并将其打印到屏幕上(使用普通的 C 函数 putchar
)。
我正在阅读有关构建简单虚拟 machine/bytecode 解释器的教程。它有 PUSH、POP、HALT 等指令......这些指令在开关中解码和评估,所以你会说如果当前指令等于 PUSH,那么你会将它压入堆栈。但是,如果我想打印出一个字符串或字符怎么办?
在汇编中,您可以在 .data
中创建一个字符串,推送长度,然后是消息,然后是 stdout (1) 的文件描述符,系统写入调用号 so 4(对于 32 位), 然后执行 int 80.
我该如何为虚拟机做这样的事情?我会以同样的方式处理吗?我想也许我可以把我想写的任何东西都转储到寄存器中,然后在其中包含(幻数)以外的内容时打印内容,但这似乎不是一个好主意。
"Printing" 假设有某种 IO (input/output) 系统,其输出设备能够在其上显示数据(如打印机或显示器)。在虚拟机上,这样的设备也只能是虚拟的,如何模拟它取决于 VM 实现。例如,它可以有一个特定的明确定义的内存范围,即 "video memory",这样在那里写入被解释为将数据发送到输出设备,这可以通过虚拟机界面中的文本框来模拟.
您需要为程序创建一种访问屏幕的方式 - 它们做不到 "automatically"。
例如(如 Eugene Sh. 的评论所建议):创建一个 PUTCHAR 操作码,它从堆栈中弹出一个数字并将其打印到屏幕上(使用普通的 C 函数 putchar
)。