# virtual-machine **Repository Path**: picasso250/virtual-machine ## Basic Information - **Project Name**: virtual-machine - **Description**: 一个超级简单的CPU模拟器 - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2020-11-01 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # virtual-machine 一个超级简单的CPU模拟器 参考 https://felixangell.com/blogs/virtual-machine-in-c 字长:32位 指令长度:int32 的整数倍 ### 指令集 指令构成由两部分构成,操作码和操作数。 操作码有1个或2个操作数。 操作码16位,第一个操作数16位,第二个操作数32位(如果有)。 下面是 c 语言式的指令解释 | 指令 | 意义 | 内部编码 | |-----------|------|----------| mov a, b | a = b | MOV mov a, 42 | a = 42 | MOVI load a, [b] | a = m[b] | LOAD save [a], b | m[a] = b | SAVE add a,b | a += b | ADD not a | a = ~a | NOT and a,b | a &= b | AND or a,b | a \|= b | OR jz a,b | if (a==0) ip += b; | JZ jmp a | ip += a; | JMP push a | s[++sp] = a | PUSH pop a | a = s[sp--] | POP put a | putc(a) | PUT get a | a = getc() | GET jz,jmp 是 short jmp,相对地址,可有负数,必须是立即数。 ps: 里面的示例程序是一个复制自身的小病毒。 已知bug:没有对register的索引做检测导致core dump.