Skip to content

Instantly share code, notes, and snippets.

@fogus
Created June 27, 2012 19:04
Show Gist options
  • Save fogus/3006068 to your computer and use it in GitHub Desktop.
Save fogus/3006068 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#define NEXT goto **ip++
int main()
{
int fact = 6, fact_b0 = 16;
void* program[] = {
&&push, (void*)5, &&call, (void*)fact, &&printi, &&end,
&&beq0, (void*)fact_b0, &&dup, &&push, (void*)1, &&sub, &&call, (void*)fact, &&mult, &&ret,
&&pop, &&push, (void*)1, &&ret };
void** ip = program;
void* stack[16] = {0}; void** sp = stack-1;
void* cstack[16] = {0}; void** cp = cstack-1;
NEXT;
call:
*++cp = ip+1; ip = program + (int)*ip;
NEXT;
ret:
ip = *cp--;
NEXT;
beq0:
ip = *sp ? ip+1 : program + (int)*ip;
NEXT;
push:
*++sp = *ip++;
NEXT;
pop:
--sp;
NEXT;
dup:
sp[1] = sp[0]; sp++;
NEXT;
mult:
sp[-1] = (void*)((int)sp[-1] * (int)sp[0]); sp--;
NEXT;
sub:
sp[-1] = (void*)((int)sp[-1] - (int)sp[0]); sp--;
NEXT;
printi:
printf("%i\n", (int)*sp--);
NEXT;
end:
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment