#include int main(int argc, char **argv) { FILE *fin, *fout; int c, label = 0, label_index = 0, label_pop, label_stack[1000]; if (argc != 3) { fprintf(stderr, "usage: %s in.bf out.asm\n", argv[0]); return 1; } fin = fopen(argv[1], "r"); fout = fopen(argv[2], "w"); if (!fin || !fout) { fprintf(stderr, "couldn't open files\n"); return 1; } fprintf(fout, "[BITS 16]\nmov bx, A\n"); while ((c = fgetc(fin)) != EOF) { switch (c) { case '>': fprintf(fout, "inc bx\n"); break; case '<': fprintf(fout, "dec bx\n"); break; case '+': fprintf(fout, "inc byte [bx]\n"); break; case '-': fprintf(fout, "dec byte [bx]\n"); break; case '.': fprintf(fout, "call print\n"); break; case ',': fprintf(fout, "call input\n"); break; case '[': fprintf(fout, "cmp byte [bx],0\njz E%d\nB%d:\n", label, label); label_stack[label_index++] = label++; break; case ']': label_pop = label_stack[--label_index]; fprintf(fout, "cmp byte [bx],0\njnz B%d\nE%d:\n", label_pop, label_pop); break; default: break; } } fprintf(fout, "ret\n" "print:\npush bx\nmov dl,[bx]\nmov ah,2\nint 21h\npop bx\nret\n" "input:\npush bx\nmov ah,8\nint 21h\npop bx\nmov [bx],al\nret\n" "A:\n"); fclose(fin); fclose(fout); return 0; }