Goto labels... Attemp #1

This commit is contained in:
german 2026-03-01 20:08:55 +04:00
parent 2362a00371
commit 4d0aa57b43
5 changed files with 77 additions and 40 deletions

2
assembler.bash Normal file
View File

@ -0,0 +1,2 @@
#!/bin/bash

View File

@ -1,4 +1,6 @@
main: main:
push.string "Hello, world!\n" # Записываем строку push.string "Hello, world!\n" ; Записываем строку
push byte 0x00 push byte 0x00
syscall syscall
push db main
jmp

BIN
ntsys

Binary file not shown.

View File

@ -1,6 +1,8 @@
#if (!defined(NTSYS_ASSEMBLER_H___)) #if (!defined(NTSYS_ASSEMBLER_H___))
#define 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 __READ_FILE_WITH_EOF_OR_LN ((c = getc(fp)) != EOF && c != '\n' && c != '\r')
#define is_space(c) (c >= 0 && c <= 32) #define is_space(c) (c >= 0 && c <= 32)
#define __SPACE_SHIFT while (is_space(st[pos])) { pos ++; } #define __SPACE_SHIFT while (is_space(st[pos])) { pos ++; }
@ -31,14 +33,14 @@ static char* get_str(char* ptr, FILE* fp) {
ptr[len] = c; ptr[len] = c;
len ++; len ++;
} }
ptr[len] = '\0';
return ptr; return ptr;
} }
/* /*
* XX - шестнадцатиричное число * XX - шестнадцатиричное число
* :S - тип данных * :S - тип данных
* :D - сами данные * :D - сами данные (или метка)
* :O - метка перехода
* *
* ------------------ Формат ------------------- * ------------------ Формат -------------------
* *
@ -82,7 +84,7 @@ int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) {
if (st[pos] == '"' && st[sP - 1] != '\\') { if (st[pos] == '"' && st[sP - 1] != '\\') {
isStr = !isStr; isStr = !isStr;
} }
if (st[pos] == '#' && isStr == 0) { if ((st[pos] == '#' || st[pos] == ';') && isStr == 0) {
st[pos] = '\0'; st[pos] = '\0';
break; break;
} }
@ -120,9 +122,9 @@ int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) {
} }
} }
char* h = (st + save); char* h = (st + save);
if (h[strlen(st + save)] == ':') { if (h[strlen(st + save) - 1] == ':') {
get_mem_pos(); get_mem_pos();
h[strlen(h - 1)] = '\0'; h[strlen(st + save) - 1] = '\0';
labels_names[lb_pos] = h; labels_names[lb_pos] = h;
labels[lb_pos++] = ((word_t)*mem_pos + 1); labels[lb_pos++] = ((word_t)*mem_pos + 1);
break; break;
@ -130,7 +132,6 @@ int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) {
if (strcmp((st + save), eq) == 0) { if (strcmp((st + save), eq) == 0) {
size_t d = strlen(__fun_names_ntsys[i] + par_pos); size_t d = strlen(__fun_names_ntsys[i] + par_pos);
size_t p = 0; size_t p = 0;
puts(st + save);
__e_byte_t data_type = 1; __e_byte_t data_type = 1;
while (p < d) { while (p < d) {
char* str = &__fun_names_ntsys[i][par_pos]; 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 ++; f ++;
} }
} else if (st[save + 1] == 'x') { } else if (st[save + 1] == 'x' && !is_space(st[save])) {
sys_cnt = 16; sys_cnt = 16;
} else if (st[save + 1] == 'b') { } else if (st[save + 1] == 'b' && !is_space(st[save])) {
sys_cnt = 2; sys_cnt = 2;
} }
if (is_str == 0) { if (is_str == 0) {
if (sys_cnt != 10) { char* eq__ = &st[save];
save += 2; if (data_type == 0xCB) {
} unsigned int __f = 0;
char* arr = NULL; __e_byte_t is_stdfdf = 0;
long cnt = strtol(&st[save], &arr, sys_cnt); while (__f < lb_pos) {
switch (data_type) { printf("Name \"%s\" equals test to \"%s\"\n", labels_names[__f], eq__);
case 0x01: fwrite((__e_byte_t*)((byte_t*)&cnt), 1, sizeof(byte_t), fp); if (strcmp(&labels_names[__f][0], eq__) == 0) {
break; fwrite((__e_byte_t*)((word_t*)&labels[__f]), 1, sizeof(word_t), fp);
case 0x02: fwrite((__e_byte_t*)((word_t*)&cnt), 1, sizeof(word_t), fp); is_stdfdf = 1;
break; break;
case 0x04: fwrite((__e_byte_t*)((dword_t*)&cnt), 1, sizeof(dword_t), fp); }
break; __f ++;
case 0x08: fwrite((__e_byte_t*)((qword_t*)&cnt), 1, sizeof(qword_t), fp); }
break; if (is_stdfdf == 0) {
case 0xF1: fwrite((__e_byte_t*)((sbyte_t*)&cnt), 1, sizeof(sbyte_t), fp); ntsys_error("Invalid ident!");
break; return EXIT_FAILURE;
case 0xF2: fwrite((__e_byte_t*)((sword_t*)&cnt), 1, sizeof(sword_t), fp); }
break; } else {
case 0xF4: fwrite((__e_byte_t*)((sdword_t*)&cnt), 1, sizeof(sdword_t), fp); if (sys_cnt != 10) {
break; save += 2;
case 0xF8: fwrite((__e_byte_t*)((sqword_t*)&cnt), 1, sizeof(sqword_t), fp); }
break; 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; data_type = 0xF4;
} else if (strcmp(&st[save], "sqword") == 0) { } else if (strcmp(&st[save], "sqword") == 0) {
data_type = 0xF8; data_type = 0xF8;
} else if (strcmp(&st[save], "db") == 0) {
data_type = 0xCB;
} else { } else {
ntsys_error("Incorrect datatype!"); ntsys_error("Incorrect datatype!");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
fwrite((__e_byte_t*)&data_type, 1, sizeof(__e_byte_t), fp); if (data_type != 0xCB) {
} fputc(data_type, fp);
break; } else {
case 'O': fputc(0x02, fp);
{ }
} }
break; break;
} }
@ -259,7 +280,6 @@ int ntsys_asm_from_string(size_t* mem_pos, char* st, FILE* fp) {
} }
} }
get_mem_pos(); get_mem_pos();
printf("Memory position: %zu\n", *mem_pos);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -287,9 +307,21 @@ int ntsys_compile_asm(char* filename, char* asm_out) {
rewind(fp); rewind(fp);
labels = malloc(sizeof(word_t) * lb_size); labels = malloc(sizeof(word_t) * lb_size);
labels_names = (char**)malloc(sizeof(char*) * 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) { while ((st = get_str(st, fp)) != NULL) {
if (ntsys_asm_from_string(&mem_pos, st, fw) != EXIT_SUCCESS) return EXIT_FAILURE; 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); free(st);
fclose(fp); fclose(fp);
fclose(fw); fclose(fw);
@ -297,12 +329,13 @@ int ntsys_compile_asm(char* filename, char* asm_out) {
} }
#undef __READ_FILE_WITH_EOF_OR_LN #undef __READ_FILE_WITH_EOF_OR_LN
#undef __SPACE_SHIFTsize_t lb_size = 1; #undef __SPACE_SHIFT
#undef is_space #undef is_space
#undef __NEXT_ARG #undef __NEXT_ARG
#undef get_mem_pos #undef get_mem_pos
#undef labels #undef labels
#undef labels_names #undef labels_names
#undef lb_pos #undef lb_pos
#undef NTSYS_MAX_LABEL_LENGTH
#endif /* NTSYS_ASSEMBLER_H___ */ #endif /* NTSYS_ASSEMBLER_H___ */

BIN
out.exe

Binary file not shown.