#if (!defined(NTSYS_ASSEMBLER_H___)) #define NTSYS_ASSEMBLER_H___ #define NTSYS_MAX_LABEL_LENGTH 32 #include "asm-savers.h" /* * :T - тип данных * :D - данные * :S - строка * XX - шестнадцатиричные данные */ const size_t ntsys_command_count = 0x1B; char* ntsys_asm_table[] = { "push=00:T:D", "pop=01:T", "push.string=02:S", "add=03:T", "sub=04:T", "mul=05:T", "div=06:T", "not=07:T", "shr=08:T", "shl=09:T", "or=0A:T", "and=0B:T", "xor=0C:T", "jmp=0D", "bnez=0E:T", "bez=0F:T", "up=10:T", "down=11:T", "eq=12:T", "neq=13:T", "upne=14:T", "downe=15:T", "mwrt=16:T", "mread=17:T", "getsp=18", "setsp=19", "syscall=1A" }; int ntsys_asm_from_string(size_t* mempos, char* str, FILE* fp, byte_t cycle, ntsys_labels_array_t labels, word_t* labels_pos, size_t* labels_count, dword_t* fsz) { ntsys_asm_save_t __save = create_ntsys_asm_save(str); ntsys_asm_cache_t __cache = create_ntsys_asm_cache(__save); ntsys_argument_parser_t parser = create_ntsys_asm_parser(__cache, fp, str, ntsys_asm_table, ntsys_command_count, labels, labels_pos, labels_count, cycle, fsz); return ntsys_run_asm_parser(parser); } int ntsys_compile_asm(char* filename, char* asm_out) { FILE* fp = fopen(filename, "r"); if (fp == NULL) { ntsys_error("Cannot open assembler file!"); return EXIT_FAILURE; } FILE* fw = fopen(asm_out, "wb"); FILE* tmp = tmpfile(); if (fw == NULL || tmp == NULL) { ntsys_error("Cannot create or rewrite output file!"); fclose(fp); return EXIT_FAILURE; } char* st = NULL; size_t mem_pos = 0; size_t lb_size = 0; while ((st = ntsys_get_str(st, fp)) != NULL) { char* cp = st; ntsys_asm_save_t __save = create_ntsys_asm_save(cp); ntsys_asm_cache_t sv = create_ntsys_asm_cache(__save); char* str = ntsys_get_arg(sv); if (str[strlen(str) - 1] == ':') { lb_size ++; } } free(st); char** labels = malloc(sizeof(char*) * lb_size); word_t* labels_pos = malloc(sizeof(word_t) * lb_size); size_t u = 0; while (u < lb_size) { labels[u] = NULL; u ++; } rewind(fp); FILE* ff = tmp; size_t labels_count = 0; dword_t fsz = 0; while ((st = ntsys_get_str(st, fp)) != NULL) { if (ntsys_asm_from_string(&mem_pos, st, tmp, 0, labels, labels_pos, &labels_count, &fsz) != EXIT_SUCCESS) { free(st); fclose(fp); fclose(tmp); fclose(fw); size_t i = 0; while (i < lb_size) { if (labels[i] != NULL) free(labels[i]); i ++; } free(labels); free(labels_pos); return EXIT_FAILURE; } } ff = fw; free(st); rewind(fp); while ((st = ntsys_get_str(st, fp)) != NULL) { if (ntsys_asm_from_string(&mem_pos, st, ff, 1, labels, labels_pos, &labels_count, &fsz) != EXIT_SUCCESS) { free(st); fclose(fp); fclose(tmp); fclose(fw); size_t i = 0; while (i < lb_size) { if (labels[i] != NULL) free(labels[i]); i ++; } free(labels); free(labels_pos); return EXIT_FAILURE; } } fclose(tmp); fflush(fw); free(st); fclose(fp); fclose(fw); size_t i = 0; while (i < lb_size) { if (labels[i] != NULL) free(labels[i]); i ++; } free(labels); free(labels_pos); return EXIT_SUCCESS; } #endif /* NTSYS_ASSEMBLER_H___ */