update opcodes to handle memory better

This commit is contained in:
zongor 2025-08-30 10:17:38 -07:00
parent 6be5a4d3f9
commit aa16b6b348
3 changed files with 53 additions and 32 deletions

View File

@ -17,8 +17,9 @@ typedef enum {
OP_MEM_SWAP, /* mswp : &dest = &src1, &src1 = &dest */
OP_MEM_MOV, /* mmov : &dest = &src1 */
OP_MEM_ALLOC, /* aloc : dest [next memory location as size] */
OP_REF, /* ref : dest = &memory[src1] */
OP_DEREF, /* dref : dest = memory[src1] */
OP_GET, /* get : dest = ptr : dest = memory[ptr] */
OP_PUT, /* put : ptr = src1 : memory[ptr] = src */
OP_OFFSET, /* offs : dest = ptr + src1 : dest = p + o */
OP_SYSCALL, /* sysc : */
OP_ADD_INT, /* addi : dest = src1 + src2 */
OP_SUB_INT, /* subi : dest = src1 - src2 */

View File

@ -108,6 +108,23 @@ bool step_vm(VM *vm) {
vm->memory[ptr] = vm->frames[vm->fp].registers[src1];
return true;
}
case OP_PUT: {
uint32_t addr = vm->frames[vm->fp].registers[dest].u;
vm->memory[addr] = vm->frames[vm->fp].registers[src1];
return true;
}
case OP_GET: {
uint32_t addr = vm->frames[vm->fp].registers[src1].u;
vm->frames[vm->fp].registers[dest] = vm->memory[addr];
return true;
}
case OP_OFFSET: {
uint32_t ptr = vm->frames[vm->fp].registers[src1].u;
uint32_t offset = vm->frames[vm->fp].registers[src2].u;
uint32_t result = ptr + offset;
vm->frames[vm->fp].registers[dest].u = result;
return true;
}
case OP_PUSH: {
vm->stack[++vm->sp] = vm->frames[vm->fp].registers[dest];
return true;
@ -116,6 +133,33 @@ bool step_vm(VM *vm) {
vm->frames[vm->fp].registers[dest] = vm->stack[vm->sp--];
return true;
}
case OP_MEM_ALLOC: {
uint32_t mem_dest = (uint32_t)vm->frames[vm->fp]
.allocated.end; /* get start of unallocated */
vm->frames[vm->fp].registers[dest].u =
mem_dest; /* store ptr of array to dest register */
uint32_t size = (uint32_t)vm->frames[vm->fp].registers[src1].u;
vm->memory[mem_dest].u = size;
vm->frames[vm->fp].allocated.end +=
size; /* increment to end of allocated */
return true;
}
case OP_MEM_MOV: {
uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u;
uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u;
vm->memory[dest_addr] = vm->memory[src_addr];
return true;
}
case OP_MEM_SWAP: {
uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u;
uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u;
vm->memory[dest_addr].u ^= vm->memory[src_addr].u;
vm->memory[src_addr].u ^= vm->memory[dest_addr].u;
vm->memory[dest_addr].u ^= vm->memory[src_addr].u;
return true;
}
case OP_SYSCALL: {
}
case OP_ADD_INT:
MATH_OP(i, +);
case OP_SUB_INT:
@ -316,31 +360,6 @@ bool step_vm(VM *vm) {
vm->memory[dest].u = equal;
return true;
}
case OP_MEM_ALLOC: {
uint32_t mem_dest = (uint32_t)vm->frames[vm->fp]
.allocated.end; /* get start of unallocated */
vm->frames[vm->fp].registers[dest].u =
mem_dest; /* store ptr of array to dest register */
uint32_t size = (uint32_t)vm->frames[vm->fp].registers[src1].u;
vm->memory[mem_dest].u = size;
vm->frames[vm->fp].allocated.end +=
size; /* increment to end of allocated */
return true;
}
case OP_MEM_MOV: {
uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u;
uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u;
vm->memory[dest_addr] = vm->memory[src_addr];
return true;
}
case OP_MEM_SWAP: {
uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u;
uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u;
vm->memory[dest_addr].u ^= vm->memory[src_addr].u;
vm->memory[src_addr].u ^= vm->memory[dest_addr].u;
vm->memory[dest_addr].u ^= vm->memory[src_addr].u;
return true;
}
}
return false; /* something bad happened */
}

View File

@ -3,8 +3,9 @@ do (int i = 50000, 0, -1) {
a = a + 5.0;
}
int b = a as nat;
print("Enter a string:");
str user_string = gets();
print(a.toS());
print(b.toS());
print(user_string);
print "Enter a string:");
str user_string = read();
print a.str;
print b.str;
print user_string;