diff --git a/assembler.bash b/assembler.bash new file mode 100644 index 0000000..05a7907 --- /dev/null +++ b/assembler.bash @@ -0,0 +1,2 @@ +#!/bin/bash + diff --git a/example.asm b/example.asm index 6f40e40..c80d446 100644 --- a/example.asm +++ b/example.asm @@ -1,4 +1,6 @@ main: - push.string "Hello, world!\n" # Записываем строку + push.string "Hello, world!\n" ; Записываем строку push byte 0x00 - syscall \ No newline at end of file + syscall + push db main + jmp \ No newline at end of file diff --git a/ntsys b/ntsys index 803a5bc..b57339c 100755 Binary files a/ntsys and b/ntsys differ diff --git a/ntsys-assembler.h b/ntsys-assembler.h index 93a89b1..f8ec283 100644 --- a/ntsys-assembler.h +++ b/ntsys-assembler.h @@ -1,6 +1,8 @@ #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 ++; } @@ -31,14 +33,14 @@ static char* get_str(char* ptr, FILE* fp) { ptr[len] = c; len ++; } + ptr[len] = '\0'; return ptr; } /* * XX - шестнадцатиричное число * :S - тип данных - * :D - сами данные - * :O - метка перехода + * :D - сами данные (или метка) * * ------------------ Формат ------------------- * @@ -82,7 +84,7 @@ int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) { if (st[pos] == '"' && st[sP - 1] != '\\') { isStr = !isStr; } - if (st[pos] == '#' && isStr == 0) { + if ((st[pos] == '#' || st[pos] == ';') && isStr == 0) { st[pos] = '\0'; break; } @@ -120,9 +122,9 @@ int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) { } } char* h = (st + save); - if (h[strlen(st + save)] == ':') { + if (h[strlen(st + save) - 1] == ':') { get_mem_pos(); - h[strlen(h - 1)] = '\0'; + h[strlen(st + save) - 1] = '\0'; labels_names[lb_pos] = h; labels[lb_pos++] = ((word_t)*mem_pos + 1); break; @@ -130,7 +132,6 @@ int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) { if (strcmp((st + save), eq) == 0) { size_t d = strlen(__fun_names_ntsys[i] + par_pos); size_t p = 0; - puts(st + save); __e_byte_t data_type = 1; while (p < d) { char* str = &__fun_names_ntsys[i][par_pos]; @@ -181,34 +182,53 @@ int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) { } f ++; } - } else if (st[save + 1] == 'x') { + } else if (st[save + 1] == 'x' && !is_space(st[save])) { sys_cnt = 16; - } else if (st[save + 1] == 'b') { + } else if (st[save + 1] == 'b' && !is_space(st[save])) { sys_cnt = 2; } if (is_str == 0) { - 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; + 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; + } } } } @@ -232,16 +252,17 @@ int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) { 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; } - fwrite((__e_byte_t*)&data_type, 1, sizeof(__e_byte_t), fp); - } - break; - case 'O': - { - + if (data_type != 0xCB) { + fputc(data_type, fp); + } else { + fputc(0x02, fp); + } } break; } @@ -259,7 +280,6 @@ int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) { } } get_mem_pos(); - printf("Memory position: %zu\n", *mem_pos); return EXIT_SUCCESS; } @@ -287,9 +307,21 @@ int ntsys_compile_asm(char* filename, char* asm_out) { 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); @@ -297,12 +329,13 @@ int ntsys_compile_asm(char* filename, char* asm_out) { } #undef __READ_FILE_WITH_EOF_OR_LN -#undef __SPACE_SHIFTsize_t lb_size = 1; +#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___ */ \ No newline at end of file diff --git a/out.exe b/out.exe index e89f83d..56ae775 100644 Binary files a/out.exe and b/out.exe differ