Taylor Bockman
7 years ago
commit
80b801753e
6 changed files with 185 additions and 0 deletions
@ -0,0 +1,43 @@ |
|||||||
|
# Prerequisites |
||||||
|
*.d |
||||||
|
|
||||||
|
# Compiled Object files |
||||||
|
*.slo |
||||||
|
*.lo |
||||||
|
*.o |
||||||
|
*.obj |
||||||
|
|
||||||
|
# Precompiled Headers |
||||||
|
*.gch |
||||||
|
*.pch |
||||||
|
|
||||||
|
# Compiled Dynamic libraries |
||||||
|
*.so |
||||||
|
*.dylib |
||||||
|
*.dll |
||||||
|
|
||||||
|
# Fortran module files |
||||||
|
*.mod |
||||||
|
*.smod |
||||||
|
|
||||||
|
# Compiled Static libraries |
||||||
|
*.lai |
||||||
|
*.la |
||||||
|
*.a |
||||||
|
*.lib |
||||||
|
|
||||||
|
# Executables |
||||||
|
*.exe |
||||||
|
*.out |
||||||
|
*.app |
||||||
|
|
||||||
|
# CMake |
||||||
|
CMakeCache.txt |
||||||
|
CMakeFiles |
||||||
|
CMakeScripts |
||||||
|
Testing |
||||||
|
Makefile |
||||||
|
cmake_install.cmake |
||||||
|
install_manifest.txt |
||||||
|
compile_commands.json |
||||||
|
CTestTestfile.cmake |
@ -0,0 +1,25 @@ |
|||||||
|
cmake_minimum_required (VERSION 3.8) |
||||||
|
|
||||||
|
set (CMAKE_CXX_STANDARD 11) |
||||||
|
|
||||||
|
set (CMAKE_C_COMPILER "clang") |
||||||
|
set (CMAKE_CXX_COMPILER "clang++") |
||||||
|
set (CMAKE_C_COMPILER_ID "Clang") |
||||||
|
set (CMAKE_CXX_COMPILER_ID "Clang") |
||||||
|
set (CMAKE_VERBOSE_MAKEFILE ON) |
||||||
|
|
||||||
|
project (uvm) |
||||||
|
|
||||||
|
set (uvm_VERSION_MAJOR 0) |
||||||
|
set (uvm_VERSION_MINOR 1) |
||||||
|
set (uvm_VERSION_PATCH 0) |
||||||
|
|
||||||
|
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) |
||||||
|
|
||||||
|
file(GLOB uvm "include/*") |
||||||
|
file(GLOB uvm "src/*") |
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME} ${uvm_SRC} ${uvm_INCLUDE}) |
||||||
|
target_link_libraries( |
||||||
|
${PROJECT_NAME} |
||||||
|
) |
@ -0,0 +1,43 @@ |
|||||||
|
# uVM - Micro Virtual Machine |
||||||
|
|
||||||
|
uVM is simply an experiment ins developing a working virtual machine with it's own bytecode. |
||||||
|
|
||||||
|
## Requirements |
||||||
|
|
||||||
|
* CMake version 3.8 or higher |
||||||
|
* Clang and Clang++ |
||||||
|
|
||||||
|
## Building |
||||||
|
|
||||||
|
1. `git clone` the repository |
||||||
|
2. `cmake .` |
||||||
|
3. `make` |
||||||
|
|
||||||
|
## Architecture |
||||||
|
|
||||||
|
uVM is a _stack machine_. That is, it gets all of it's arguments from the stack, and returns the result |
||||||
|
of the computation back to the stack when it's done. |
||||||
|
|
||||||
|
There are some exceptions to this. In particular the current version of uvm supports a single variable, |
||||||
|
called `0`, that can be written to using `xpop0` where x is the datatype of the thing getting taken off |
||||||
|
the stack. |
||||||
|
|
||||||
|
Additionally `0` can be placed on the top of the stack using `xpush0`. |
||||||
|
|
||||||
|
## uVM Instruction Set |
||||||
|
|
||||||
|
uVM possesses the standard issue instruction set you might expect in a simple VM: |
||||||
|
|
||||||
|
| Instruction | Opcode | Action | |
||||||
|
| ------------ | ------ | ------------------------------------------------------------------------------ | |
||||||
|
| ipush _X_ | 0 | Pushes _integer_ X onto the stack | |
||||||
|
| ipush0 | 1 | Pushes the _integer_ in `0` onto the stack | |
||||||
|
| ipop0 | 2 | Pops the top _integer_ of the stack off and into variable 0 | |
||||||
|
| icmp | 3 | Compares the top two items on the stack together and returns a boolean result | |
||||||
|
| iadd | 4 | Adds the top two _integer_ arguments of the stack together | |
||||||
|
| isub | 5 | Subtracts the top two _integer_ arguments of the stack from each other | |
||||||
|
| jmp _LABEL_ | 6 | Unconditional jump to _label_ | |
||||||
|
| jc _LABEL_ | 7 | Jump if the top of the stack is a 1 | |
||||||
|
|
||||||
|
|
||||||
|
As I learn more about VM development this instruction set will likely become much more robust. |
@ -0,0 +1,25 @@ |
|||||||
|
// This file is part of UVM.
|
||||||
|
//
|
||||||
|
// UVM is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// UVM is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with UVM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef DECODER_H_ |
||||||
|
#define DECODER_H_ |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // DECODER_H_
|
@ -0,0 +1,33 @@ |
|||||||
|
// This file is part of UVM.
|
||||||
|
//
|
||||||
|
// UVM is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// UVM is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with UVM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef OPCODES_H_ |
||||||
|
#define OPCODES_H_ |
||||||
|
|
||||||
|
// Instructions
|
||||||
|
|
||||||
|
#define IPUSH 0x0 |
||||||
|
#define IPUSH0 0x1 |
||||||
|
#define IPOP0 0x2 |
||||||
|
#define CMP 0x3 |
||||||
|
#define IADD 0x4 |
||||||
|
#define ISUB 0x5 |
||||||
|
#define JMP 0x6 |
||||||
|
#define JC 0x7 |
||||||
|
|
||||||
|
#endif // OPCODES_H_
|
@ -0,0 +1,16 @@ |
|||||||
|
// This file is part of UVM.
|
||||||
|
//
|
||||||
|
// UVM is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// UVM is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with UVM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
//
|
Loading…
Reference in new issue