There are still plenty of questions to resolve about the bytecode ISA in question, or at least which you haven't explained to us even if you have. For example:
- What is the total addressing range?
- Are instruction addresses absolute or relative?
- What is the total size of the register file? Are all the registers general-purpose, or are some dedicated to specific purposes (e.g., instruction pointer, stack pointer, frame/base pointer, etc)?
- Will the special-purpose registers, if any, be mapped to the general register file, or will they be separate?
- If the special-purpose registers are separate, would you require them to be accessed only by special-purpose instructions?
- If all the registers are general, will there be any conventions for how they are used (like in MIPS and to a lesser extent ARM)?
- Will you have a Zero register (that is, a register which is permanently set to zero), like in MIPS?
- How will you move data from register to register? From register to memory, and vice versa? From memory to memory?
- Will you have any immediate format instructions, and if not, how will you initialize memory values?
- Will you use a load/store architecture, or will you allow arbitrary memory instructions? (That is to say, will all of the arithmetic and logical operations be done only in registers, or will they be able to work to and from memory directly?)
- How will you handle nilary (zero-operand) and unary (one-operand) instructions in the instruction stream?
- How are signed integers represented? (2's-complement would be the obvious solution, but it isn't a given.)
- How will you indicate CPU conditions, if at all?
- How will you handle arithmetic overflows and underflows?
- Will multiplication and division require pairs of registers, or will you have a separate double-size register for those operations?
- Will you have special instructions and/or a special memory range for I/O (a la the x86), or will it all be memory-mapped (like most newer designs)?
- Will you have anything like a (simulated) interrupt mechanism? Software interrupts (traps)? Exception interrupts (e.g., division by zero)?
As has already been said, it would be a good idea to look into existing Instruction Set Architecture designs other than the x86, both real (
MIPS, ARM, M68K) and virtual (
p-code, JVM, LLVM, .NET CLI), to get a broader idea of what can be done in an ISA, and get a feel for what works and what doesn't and why.
Finally, consider this: most bytecode systems are stack-based (that is, the majority of the instructions operate directly on the values at or near the top of the stack), but hardly any hardware implementations are. Why? What impact does the use of memory to simulate registers (which in a hardware CPU is usually an order of magnitude or more faster than memory access) have on this design issue? What impact does the design and compilation of high-level languages (e.g., Pascal, Java, Python) have on the choice to use stack machine bytecodes instead of register-machine bytecodes? And how does designing a VM versus a real CPU alter the decision to use complex-action instructions (e.g., memory-to-memory block moves), rather than relying on simpler ones?