#include int prog[] = {2,4,1,1,7,5,4,4,1,4,0,3,5,5,3,0}; int plen = sizeof(prog) / sizeof(int); long reverse(int i, long init) { long a = init; // jnz,0 if (i >= plen) { return init; } // in,5 int b = prog[plen-i-1]; // adv,3, a <<= 3l; // bxl,4 b ^= 4; // cdv,5 // bxc,4 long q; for (q = 0; q < 8; q++) { if (((q^1) ^ ((((a|q)>>(q^1)))&7)) == b) { // bst 4 // bxl,1 long x = reverse(i+1, a|q); if (x >= 0) { return x; } } } //error if (a == 0) { return -1; } return -a; } int run(long a) { int b = 0; int c = 0; int i = 0; // 4:a 5:b 6:c do { // bst 4 b = a%8; // // bxl,1 b ^= 1; // cdv,5 c = (a&65535) >> b; // bxc,4 b ^= c; // bxl,4 b ^= 4; // adv,3, a >>= 3; // out,5 printf("%d", b%8); if (i >= plen || (b%8) != prog[i]) { printf("!"); } printf(" "); i++; // jnz,0 } while (a != 0); printf("\n"); return 0; } int main() { long a = reverse(0, 0); printf("%ld\n", a); run(a); return 0; }