Goto labels... Attemp #1
This commit is contained in:
parent
2362a00371
commit
4d0aa57b43
2
assembler.bash
Normal file
2
assembler.bash
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
@ -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
|
||||||
@ -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___ */
|
||||||
Loading…
x
Reference in New Issue
Block a user