10 char *program
[50]; // sized based on pre-inspecting file
13 get (const char *value
)
16 return regs
[*value
- 'a'];
21 set (const char *reg
, int value
)
24 printf (" setting %s to %d\n", reg
, value
);
25 regs
[*reg
- 'a'] = value
;
28 int main(int argc
, char **argv
)
31 char buf
[200]; // sized based on pre-inspecting file
32 int nread
= fread (buf
, 1, sizeof buf
, stdin
);
34 while (p
< buf
+ nread
) {
39 printf ("program consists of %d instructions\n", instr
);
44 char arg1
[10], arg2
[10];
48 printf ("count=%lld pc=%d a=%d b=%d c=%d d=%d, executing %s\n", count
,
49 pc
, regs
[0], regs
[1], regs
[2], regs
[3], program
[pc
]);
50 sscanf (program
[pc
], "%*s %9s %9s", arg1
, arg2
);
51 switch (program
[pc
][0]) {
54 set (arg2
, get (arg1
));
57 set (arg1
, get (arg1
) + 1);
60 set (arg1
, get (arg1
) - 1);
67 line
= get (arg1
) + pc
;
70 printf (" rewriting instruction %d, was %s\n", line
, program
[line
]);
71 switch (*program
[line
]) {
73 memcpy (program
[line
], "dec", 3);
77 memcpy (program
[line
], "inc", 3);
80 memcpy (program
[line
], "jnz", 3);
83 memcpy (program
[line
], "cpy", 3);
95 printf ("after %lld operations, final content of register a: %d\n",