- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在用 C 语言编写一个虚拟机,所有各种函数都可以正常工作,但是我在将它们组合在一起时遇到了问题。具体来说,我遇到了一个问题,我需要一种方法来增加程序计数器,而不会干扰改变 pc 指向的指令,如 JMP、JPC、CAL 和 RET。当我尝试采取措施取消 pc++,如 PCvalueAfterJmp - 1 或 if
语句以不在这些情况下递增时,它突然进入无限循环,似乎在重复执行指令。
这个程序读入一个输入文件并在屏幕上打印出正在处理的指令和堆栈的当前状态
int main(int argc, char* argv[]){
int running = 1;
int numInstructions = 0;
int lineRun;
int arcntr = 0;
//Memory
int stack[MAX_STACK_HEIGHT];
instruction code[MAX_CODE_LENGTH];
int arlist[MAX_STACK_HEIGHT];
//Registers
int sp=0;
int bp=1;
int pc=0;
instruction ir;
//Initializing ir
ir.op = 0;
ir.l = 0;
ir.m = 0;
//Initializing stack
stack[1] = 0;
stack[2] = 0;
stack[3] = 0;
//Reading the input file
numInstructions = readFile(argc, argv, code);
if(numInstructions < 0) //Exit with error if readFile returns invalid
return 1;
//show input code
printFile(code, numInstructions);
//setup and labeling
printState(-1, ir, pc, bp, sp, stack, arlist);
//Execution loop
while(running)
{
lineRun = pc;
//Fetch cycle
ir = code[pc];
//Execution cycle returns a nonzero to keep program running until end
if(!execOp(&sp, &bp, &pc, ir, code, stack, arlist, &arcntr))
running = 0;
//if statement didn't work
printState(lineRun, ir, pc, bp, sp, stack, arlist);
//if (!(ir.op == 5 || ir.op == 7 || ir.op == 8 || (ir.op == 2 && ir.m == 0)))
pc++;
}
return 0;
}
这是我的执行周期
int execOp(int* sp, int* bp, int* pc, instruction ir, instruction code[],
int stack[], int arlist[], int* arcntr){
switch((opcode)ir.op){
case LIT:
stack[++(*sp)] = ir.m;
break;
case OPR: //Operators
switch((operator)ir.m){
case RET:
if(*bp == 1) //Kill the simulation if we're at the base level
return 0;
arlist[--(*arcntr)] = 0;
*sp = *bp - 1;
*pc = stack[*sp+3];
*bp = stack[*sp+2];
break;
case NEG:
stack[*sp] = -stack[*sp];
break;
case ADD:
(*sp)--;
stack[*sp] = stack[*sp] + stack[*sp+1];
break;
case SUB:
(*sp)--;
stack[*sp] = stack[*sp] - stack[*sp+1];
break;
case MUL:
(*sp)--;
stack[*sp] = stack[*sp] * stack[*sp+1];
break;
case DIV:
(*sp)--;
stack[*sp] = stack[*sp] / stack[*sp+1];
break;
case ODD:
stack[*sp] = stack[*sp] % 2;
break;
case MOD:
(*sp)--;
stack[*sp] = stack[*sp] % stack[(*sp)+1];
break;
case EQL:
(*sp)--;
stack[*sp] = stack[*sp] == stack[*sp+1];
break;
case NEQ:
(*sp)--;
stack[*sp] = stack[*sp] != stack[*sp+1];
break;
case LSS:
(*sp)--;
stack[*sp] = stack[*sp] < stack[*sp+1];
break;
case LEQ:
(*sp)--;
stack[*sp] = stack[*sp] <= stack[*sp+1];
break;
case GTR:
(*sp)--;
stack[*sp] = stack[*sp] > stack[*sp+1];
break;
case GEQ:
(*sp)--;
stack[*sp] = stack[*sp] >= stack[*sp+1];
break;
}
break;
case LOD:
stack[++*sp] = stack[base(ir.l, *bp, stack) + ir.m];
break;
case STO:
stack[base(ir.l, *bp, stack) + ir.m] = stack[(*sp)--];
break;
case CAL:
arlist[(*arcntr)++] = *sp + 1;
stack[*sp + 1] = base(ir.l, *bp, stack);
stack[*sp + 2] = *bp;
stack[*sp + 3] = *pc - 1;
*bp = *sp + 1;
*pc = ir.m;
break;
case INC:
*sp = *sp + ir.m;
break;
case JMP:
*pc = ir.m;
break;
case JPC:
if(!stack[(*sp)--])
*pc = ir.m;
break;
case SOI:
printf("%d\n", stack[(*sp)--]);
break;
case SIO:
scanf("%d", &stack[++(*sp)]);
break;
}
return 1; //A non-zero return value keeps the machine running
}
最佳答案
你的这部分指令 decode select
语句似乎是错误的
case CAL:
arlist[(*arcntr)++] = *sp + 1;
stack[*sp + 1] = base(ir.l, *bp, stack);
stack[*sp + 2] = *bp;
stack[*sp + 3] = *pc - 1;
*bp = *sp + 1;
*pc = ir.m;
break;
通常您希望在返回时返回到 NEXT 指令。
堆栈[*sp + 3] = *pc - 1;
*pc-1
部分可能会在返回时将您带回到调用指令
我预计您会想要压入下一条指令的地址。
在推送所有这些之后,您可能还想将堆栈指针更新 3,并检查您的 BP 逻辑
关于c - 模拟虚拟机,增加pc vs jumps有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39582580/
我的 PC 上有一个服务器应用程序,它读取 jpg 文件并通过套接字将其发送到 Android 设备。问题是,当Android设备接收到字节数组时,无法将其转换为位图。我创建了一个 PC 应用程序来接
我创建了一个 JavaFX 应用程序。现在我想确保它不被复制到其他计算机上。更详细地说,我将该应用程序出售给一位客户,安装该应用程序后,我需要确保其不被从一台计算机复制到另一台计算机。 如何防止他人复
我构建了一个使用 Dynamic 关键字的程序。 在我的代码中,我这样做了: public void OnNext(ExpandoObject value) { dynamic expando
如何通过USB在两台PC之间进行通信?我想要一个程序通过 USB 端口将数字发送到另一台 PC,另一个程序将在该 PC 上显示这些数字。我觉得这是不可能的,因为 PC 是主机而不是设备,但 USB 真
我的代码在 virtualbox 中完美运行,但在真实 PC 上启动时却无法运行(从 BIOS 检测为 USB 硬盘驱动器的 USB 笔驱动器)。 在虚拟框中;该代码将磁盘的第 2 和第 3 扇区读取
在开发 PC HD 损坏后,我正在考虑让我的开发环境完全基于虚拟 PC。 核心项目是:- XP Pro 32- IIS- VS2003- VS2008- SQL Server 2005- Office
我目前使用的是 Windows Server 2008 Standard 并且有几台 Hyper V 机器。这些是开发 VM,我现在想切换回 Vista x64,因为我缺少 Aero。 我知道 Win
我使用 Virtual PC 来创建新的环境来测试我的安装程序。但我一定是做错了什么,因为内部装有 Vista 或 XP 的 VPC 镜像占用了大约 15GB 的磁盘空间(包括安装在其中的 VS200
大家好,我正在调试一些 CS 程序,为了查看应用程序在慢速互联网中的性能,我尝试了很多不同的方法。然而最好的是服务器端和客户端在同一台电脑上——我的服务器端和客户端的调试环境是在一台电脑上设置的。 所
我有兴趣制作一个将字符串从一台计算机传输到另一台计算机的应用程序。我对 TCP 或 UDP 通信感兴趣。我已经实现了 UDP,但它似乎能够发送最多 512 字节的数据/数据包。在两端实现数据包拆分和连
在为 Pocket PC 平台开发软件时,我一直很高兴地使用 Microsoft 随 Visual Studio 提供的 Pocket PC 模拟器(并且可以免费下载)。它提供了更快的开发/部署/测试
我想执行一个批处理文件 D:\apache-tomcat-6.0.20\apache-tomcat-7.0.30\bin\shutdown.bat 这是在我的服务器上 inidsoasrv01 . 我
我目前正在我的开发 PC 上使用 Jenkins。我把它安装在我的开发电脑上,因为我对这个工具的了解有限;所以我在我的开发电脑上对其进行了测试。现在,我对 Jenkins 作为我在构建过程中的长期“合
互联网上有很多示例展示了如何编写一个应用程序,使我们能够通过蓝牙与手机与电脑进行通信。但我想做的是通过蓝牙从另一台电脑控制一台电脑。我正在尝试使用蓝牙库。我在一台电脑上运行服务器,并尝试使用此处的示例
我正在寻找一个基准测试(以及在其他 PC 上的结果),它可以让我了解通过升级我的 PC 可以获得的开发性能提升,而且该基准测试可以用来向我的老板证明升级的合理性。 我使用 Visual Studio
我只在一台 PC 上有异常,在其他 PC 上一切正常,有人知道它是从哪里来的吗? dditional information: Requested Windows Runtime type 'Wind
我想创建一个软件,它可以使用 session 选项进行 pc 到 pc 调用(没有电话)。所有参与者将仅使用该软件。我擅长使用不同的语言、平台和数据库进行编程。但是我以前没有做过这种类型的软件。 我将
我做了这个布局。 template 唯一的问题是宽度问题。它因显示器而异,取决于显示器的宽度。主菜单和标题区域的左右两侧都有空白区域。在页脚的情况下你可以看到同样的情况.. 根据我的显示器宽度,我有
我在我的电脑上编译了一个内核,然后我把它安装在同一台电脑上,它工作正常。我的问题是如何在另一台计算机上安装相同的内核? 最佳答案 您需要复制 vmlinuz-[version number] 和 in
我正在使用 Mysql,我在两个不同的系统中有两个数据库。我希望我的本地数据库与远程数据库同步。这两个架构将具有相同的表和列。 每当远程数据库发生变化时,我的本地数据库中应该发生变化/更新。 怎么做?
我是一名优秀的程序员,十分优秀!