Name: Anonymous 2014-07-18 23:51
It's cheating.
.macro hax, anus
hax \anus
.endm
hax myanus
#include <stdio.h>
#include <stdint.h>
enum
{
start,
start2,
print,
sys_call,
sys_ret,
end
};
enum
{
pc,
pc_p,
pc_n,
ret_p,
usr
};
int
main (void)
{
uintptr_t reg[0x10] = {0};
uintptr_t ret[0x10] = {0};
loop:
switch (reg[pc]++)
{
case start:
reg[usr + 0] = (uintptr_t)"hi\n";
reg[usr + 1] = (uintptr_t)stdout;
reg[pc_n] = print;
reg[pc_p] = start2;
reg[pc] = sys_call;
break;
case start2:
reg[usr + 0] = (uintptr_t)"hi\n";
reg[usr + 1] = (uintptr_t)stdout;
reg[pc_n] = print;
reg[pc_p] = end;
reg[pc] = sys_call;
break;
case print:
fputs ((void *)reg[usr + 0], (void *)reg[usr + 1]);
reg[pc] = sys_ret;
break;
case sys_call:
ret[reg[ret_p]++] = reg[pc_p];
reg[pc] = reg[pc_n];
break;
case sys_ret:
reg[pc] = ret[--reg[ret_p]];
break;
default:
fprintf (stderr, "error, pc: %d\n", (int)reg[pc]);
break;
}
if (reg[pc] < end)
goto loop;
return 0;
}