From 23c6de3601a4039b8bd5700d20687ead9eae9a11 Mon Sep 17 00:00:00 2001 From: Luke Date: Thu, 17 Jul 2025 17:04:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20SyscallCommand=20?= =?UTF-8?q?=E7=B1=BB=E5=AE=9E=E7=8E=B0=E7=B3=BB=E7=BB=9F=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 SyscallCommand 类,用于处理系统调用命令(opcode =0x0401) --- .../system/control/SyscallCommand.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/main/java/org/jcnc/snow/vm/commands/system/control/SyscallCommand.java diff --git a/src/main/java/org/jcnc/snow/vm/commands/system/control/SyscallCommand.java b/src/main/java/org/jcnc/snow/vm/commands/system/control/SyscallCommand.java new file mode 100644 index 0000000..017d561 --- /dev/null +++ b/src/main/java/org/jcnc/snow/vm/commands/system/control/SyscallCommand.java @@ -0,0 +1,72 @@ +package org.jcnc.snow.vm.commands.system.control; + +import org.jcnc.snow.vm.interfaces.Command; +import org.jcnc.snow.vm.module.CallStack; +import org.jcnc.snow.vm.module.LocalVariableStore; +import org.jcnc.snow.vm.module.OperandStack; + +import java.util.Arrays; + +/** + * SyscallCommand ―― 统一的系统调用入口(opcode = 0x0401)。 + * + *

当前支持子命令: + *

+ * + *

用法示例(VM 指令):

+ *
+ *   1025 PRINT "Hello, Snow!"
+ *   I_PUSH 42
+ *   1025 PRINTLN
+ * 
+ */ +public class SyscallCommand implements Command { + + @Override + public int execute(String[] parts, int currentPC, + OperandStack operandStack, + LocalVariableStore localVariableStore, + CallStack callStack) { + + if (parts.length < 2) + throw new IllegalArgumentException("SYSCALL requires a sub-command"); + + String subCmd = parts[1].toUpperCase(); + + switch (subCmd) { + case "PRINT": + case "PRINTLN": { + boolean newline = subCmd.equals("PRINTLN"); + String output; + + // 指令里直接带字符串常量 + if (parts.length > 2) { + output = String.join(" ", Arrays.copyOfRange(parts, 2, parts.length)); + if (output.length() >= 2 && + output.startsWith("\"") && + output.endsWith("\"")) { + output = output.substring(1, output.length() - 1); // 去掉首尾引号 + } + } + // 没带常量,则弹栈打印 + else { + Object value = operandStack.pop(); + output = String.valueOf(value); + } + + if (newline) System.out.println(output); + else System.out.print(output); + break; + } + + default: + throw new UnsupportedOperationException("Unsupported SYSCALL: " + subCmd); + } + + // 下一条指令 + return currentPC + 1; + } +}