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:
|
||||
push.string "Hello, world!\n" # Записываем строку
|
||||
push.string "Hello, world!\n" ; Записываем строку
|
||||
push byte 0x00
|
||||
syscall
|
||||
syscall
|
||||
push db main
|
||||
jmp
|
||||
@ -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___ */
|
||||
Loading…
x
Reference in New Issue
Block a user