#if (!defined(NTSYS_ASSEMBLER_H___)) #define NTSYS_ASSEMBLER_H___ #define NTSYS_MAX_LABEL_LENGTH 32 #define __READ_FILE_WITH_EOF_OR_LN ((c = getc(fp)) != EOF && c != '\n' && c != '\r') #define is_space(c) (c >= 0 && c <= 32) #define __SPACE_SHIFT while (is_space(st[pos])) { pos ++; } #define __NEXT_ARG {__e_byte_t isStr = 0;while (!is_space(st[save]) || isStr == 1) { if (st[save] == '"' && st[save - 1] != '\\') {isStr = !isStr;}save ++; }}while (is_space(st[save])) { save ++; }{size_t n_p = save;__e_byte_t isStr = 0;while (!is_space(st[n_p]) || isStr == 1) { if (st[n_p] == '"' && st[n_p - 1] != '\\') {isStr = !isStr;}n_p ++; }st[n_p] = '\0';} #define get_mem_pos() *mem_pos = ftell(fp) == 0 ? 0 : ftell(fp) - 1; static char* get_str(char* ptr, FILE* fp) { if (ptr != NULL) { free(ptr); } unsigned long len = 0; int c; { unsigned long save_ptr = ftell(fp); while (__READ_FILE_WITH_EOF_OR_LN) { len ++; } fseek(fp, save_ptr, SEEK_SET); } if (len == 0) return NULL; ptr = malloc(len); if (ptr == NULL) { ntsys_error("Out of memory!"); return NULL; } len = 0; while (__READ_FILE_WITH_EOF_OR_LN) { ptr[len] = c; len ++; } ptr[len] = '\0'; return ptr; } /* * XX - шестнадцатиричное число * :S - тип данных * :D - сами данные (или метка) * * ------------------ Формат ------------------- * * имя_комманды=описание * */ char __fun_names_ntsys[][20] = { "push=00:S:D", "pop=01:S", "push.string=02:D" }; static size_t __index_of(char* arr, char c) { size_t i = 0; while (i < strlen(arr)) { if (arr[i] == c) break; i ++; } return i; } word_t* shfdiyde_labels = NULL; char** shdgsjgdsjjgds_names = NULL; size_t sfdfshgshgfs_lb_pos = 0; #define labels_names shdgsjgdsjjgds_names #define labels shfdiyde_labels #define lb_pos sfdfshgshgfs_lb_pos int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) { if (st == NULL) { ntsys_error("Null Pointer Exception!"); return EXIT_FAILURE; } size_t len = strlen(st); size_t pos = 0; __e_byte_t isStr = 0; while (pos < len) { size_t sP = pos; if (pos == 0) sP = 1; if (st[pos] == '"' && st[sP - 1] != '\\') { isStr = !isStr; } if ((st[pos] == '#' || st[pos] == ';') && isStr == 0) { st[pos] = '\0'; break; } pos ++; } if (isStr == 1) { ntsys_error("Find no close string!"); return EXIT_FAILURE; } isStr = 0; len = strlen(st); pos = 0; { __SPACE_SHIFT; size_t save = pos; while (!is_space(st[pos])) { pos ++; } st[pos] = '\0'; size_t arr_len = sizeof(__fun_names_ntsys) / sizeof(__fun_names_ntsys[0]); size_t i = 0; while (i < arr_len) { char eq[20]; strcpy(eq, __fun_names_ntsys[i]); size_t par_pos = 0; { size_t u = 0; size_t d = strlen(__fun_names_ntsys[i]); while (u < d) { eq[u] = __fun_names_ntsys[i][u]; if (eq[u] == '=') { eq[u] = '\0'; par_pos = u + 1; break; } u ++; } } char* h = (st + save); if (h[strlen(st + save) - 1] == ':') { get_mem_pos(); h[strlen(st + save) - 1] = '\0'; labels_names[lb_pos] = h; labels[lb_pos++] = ((word_t)*mem_pos + 1); break; }; if (strcmp((st + save), eq) == 0) { size_t d = strlen(__fun_names_ntsys[i] + par_pos); size_t p = 0; __e_byte_t data_type = 1; while (p < d) { char* str = &__fun_names_ntsys[i][par_pos]; if (str[p] == ':') { p ++; switch (str[p]) { case 'D': { __NEXT_ARG; __e_byte_t sys_cnt = 10; __e_byte_t is_str = 0; if (st[save] == '"') { is_str = 1; size_t f = 0; save ++; while (1) { if (st[save + f] == '"' && st[save + f - 1] != '\\') { putc('\0', fp); break; } if (st[save + f] == '\\' && st[save + f - 1] != '\\') { f ++; continue; } if (st[save + f - 1] == '\\') { switch (st[save + f]) { case '0': putc('\0', fp); break; case 'a': putc('\a', fp); break; case 'b': putc('\b', fp); break; case 't': putc('\t', fp); break; case 'n': putc('\n', fp); break; case 'v': putc('\v', fp); break; case 'f': putc('\f', fp); break; case 'r': putc('\r', fp); break; case '\\': putc('\\', fp); break; default: ntsys_error("Unknown ident!"); return EXIT_FAILURE; } } else { putc(st[save + f], fp); } f ++; } } else if (st[save + 1] == 'x' && !is_space(st[save])) { sys_cnt = 16; } else if (st[save + 1] == 'b' && !is_space(st[save])) { sys_cnt = 2; } if (is_str == 0) { char* eq__ = &st[save]; if (data_type == 0xCB) { unsigned int __f = 0; __e_byte_t is_stdfdf = 0; while (__f < lb_pos) { printf("Name \"%s\" equals test to \"%s\"\n", labels_names[__f], eq__); if (strcmp(&labels_names[__f][0], eq__) == 0) { fwrite((__e_byte_t*)((word_t*)&labels[__f]), 1, sizeof(word_t), fp); is_stdfdf = 1; break; } __f ++; } if (is_stdfdf == 0) { ntsys_error("Invalid ident!"); return EXIT_FAILURE; } } else { if (sys_cnt != 10) { save += 2; } char* arr = NULL; long cnt = strtol(&st[save], &arr, sys_cnt); switch (data_type) { case 0x01: fwrite((__e_byte_t*)((byte_t*)&cnt), 1, sizeof(byte_t), fp); break; case 0x02: fwrite((__e_byte_t*)((word_t*)&cnt), 1, sizeof(word_t), fp); break; case 0x04: fwrite((__e_byte_t*)((dword_t*)&cnt), 1, sizeof(dword_t), fp); break; case 0x08: fwrite((__e_byte_t*)((qword_t*)&cnt), 1, sizeof(qword_t), fp); break; case 0xF1: fwrite((__e_byte_t*)((sbyte_t*)&cnt), 1, sizeof(sbyte_t), fp); break; case 0xF2: fwrite((__e_byte_t*)((sword_t*)&cnt), 1, sizeof(sword_t), fp); break; case 0xF4: fwrite((__e_byte_t*)((sdword_t*)&cnt), 1, sizeof(sdword_t), fp); break; case 0xF8: fwrite((__e_byte_t*)((sqword_t*)&cnt), 1, sizeof(sqword_t), fp); break; } } } } break; case 'S': { __NEXT_ARG; if (strcmp(&st[save], "byte") == 0) { data_type = 0x01; } else if (strcmp(&st[save], "word") == 0) { data_type = 0x02; } else if (strcmp(&st[save], "dword") == 0) { data_type = 0x04; } else if (strcmp(&st[save], "qword") == 0) { data_type = 0x08; } else if (strcmp(&st[save], "sbyte") == 0) { data_type = 0xF1; } else if (strcmp(&st[save], "sword") == 0) { data_type = 0xF2; } else if (strcmp(&st[save], "sdword") == 0) { data_type = 0xF4; } else if (strcmp(&st[save], "sqword") == 0) { data_type = 0xF8; } else if (strcmp(&st[save], "db") == 0) { data_type = 0xCB; } else { ntsys_error("Incorrect datatype!"); return EXIT_FAILURE; } if (data_type != 0xCB) { fputc(data_type, fp); } else { fputc(0x02, fp); } } break; } } else { char* hx = "0123456789ABCDEF"; __e_byte_t hex = (__index_of(hx, str[p + 1])) | (__index_of(hx, str[p]) << 4); fputc(hex, fp); p ++; } p ++; } break; } i ++; } } get_mem_pos(); return EXIT_SUCCESS; } 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"); if (fw == 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 = 1; int c; while ((c = getc(fp)) != EOF) { if (c == ':') { lb_size ++; } } rewind(fp); labels = malloc(sizeof(word_t) * lb_size); labels_names = (char**)malloc(sizeof(char*) * lb_size); unsigned int count = 0; while (count < lb_size) { labels_names[count] = (char*)malloc(sizeof(char) * NTSYS_MAX_LABEL_LENGTH); count ++; } while ((st = get_str(st, fp)) != NULL) { if (ntsys_asm_from_string(&mem_pos, st, fw) != EXIT_SUCCESS) return EXIT_FAILURE; } count = 0; while (count < lb_size) { free(labels_names[count]); count ++; } free(labels_names); free(labels); free(st); fclose(fp); fclose(fw); return EXIT_SUCCESS; } #undef __READ_FILE_WITH_EOF_OR_LN #undef __SPACE_SHIFT #undef is_space #undef __NEXT_ARG #undef get_mem_pos #undef labels #undef labels_names #undef lb_pos #undef NTSYS_MAX_LABEL_LENGTH #endif /* NTSYS_ASSEMBLER_H___ */