Fixed
This commit is contained in:
parent
fdecc2ed7d
commit
f92ba731b8
44
ASM.md
Normal file
44
ASM.md
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# Assemly NTSYS
|
||||||
|
Это справочник по ассемблеру в **NTSYS**. Тут представлены основные комманды и описание синтаксиса.
|
||||||
|
## Операторы
|
||||||
|
Основной программной единицей является оператор. Это одно из зарезервированных слов. Названия операторов те же, что и в [BINCOM](https://gitlabor.ru/German/ntsys/src/branch/main/BINCOM.md), но в нижнем регистре (нижнее подчеркивание заменено точкой). Их синтаксис следующий:
|
||||||
|
```asm
|
||||||
|
оператор операнд1, операнд2, ... операндN
|
||||||
|
```
|
||||||
|
Операнды нужны для передачи данных в операторы.
|
||||||
|
## Метки
|
||||||
|
Метки используются для относительного перехода в любое место программы. Они состоят из алфавитно-цифровых символов, а также нижнего подчеркивания и знака минус, двоеточия и переноса строки:
|
||||||
|
```asm
|
||||||
|
ИмяМетки:
|
||||||
|
; ... код
|
||||||
|
```
|
||||||
|
Для записи метки используется специальный тип данных - **db**:
|
||||||
|
```asm
|
||||||
|
main:
|
||||||
|
push db main
|
||||||
|
jmp
|
||||||
|
```
|
||||||
|
## Комментарии
|
||||||
|
Комментарий нужен для создания пояснения к коду. Любой текст в комментарии игнорируется.
|
||||||
|
Пример:
|
||||||
|
```asm
|
||||||
|
; Это комментарий
|
||||||
|
; Это тоже
|
||||||
|
```
|
||||||
|
## Типы данных
|
||||||
|
Основные типы данных:
|
||||||
|
- ```byte``` - 8bit без знака
|
||||||
|
- ```word``` - 16bit без знака
|
||||||
|
- ```dword``` - 32bit без знака
|
||||||
|
- ```qword``` - 64bit без знака
|
||||||
|
- ```sbyte``` - 8bit знаковый
|
||||||
|
- ```sword``` - 16bit знаковый
|
||||||
|
- ```sdword``` - 32bit знаковый
|
||||||
|
- ```sqword``` - 64bit знаковый
|
||||||
|
- Строки - [ASCIIZ-строка](https://ru.wikipedia.org/wiki/%D0%9D%D1%83%D0%BB%D1%8C-%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0?ysclid=mmhsfli7p5897685524)
|
||||||
|
|
||||||
|
Строки заключаются в двойные кавычки:
|
||||||
|
```
|
||||||
|
push.string "Строка"
|
||||||
|
```
|
||||||
|
Поддерживаются следующие управляющие символы: ```\0, \a, \b, \t, \n, \v, \f, \r, \\, \"```.
|
||||||
22
EXAMPLES.md
Normal file
22
EXAMPLES.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# Примеры на ассемблере NTSYS
|
||||||
|
Это небольшой набор примеров для ассемблера NTSYS.
|
||||||
|
## Hello, world!
|
||||||
|
```asm
|
||||||
|
main: ; Метка main
|
||||||
|
push.string "Hello, world!\n" ; Записываем строку
|
||||||
|
push byte, 0x00 ; Запись номера SYSCALL
|
||||||
|
syscall ; Системный вызов
|
||||||
|
```
|
||||||
|
## Читаем имя пользователя
|
||||||
|
```asm
|
||||||
|
main:
|
||||||
|
push.string "Введите ваше имя: " ; Строка
|
||||||
|
push byte, 0x00
|
||||||
|
syscall
|
||||||
|
getch:
|
||||||
|
push db getch
|
||||||
|
push byte, 0x01
|
||||||
|
syscall
|
||||||
|
push byte, 0x0A
|
||||||
|
neq byte
|
||||||
|
```
|
||||||
@ -4,6 +4,7 @@
|
|||||||
- ```--asm / -a - compile assembler program```
|
- ```--asm / -a - compile assembler program```
|
||||||
- ```--out / -o - set output file name```
|
- ```--out / -o - set output file name```
|
||||||
- ```--debug / -d - display debugging info```
|
- ```--debug / -d - display debugging info```
|
||||||
|
- ```--mem / -m - asm output memory size```
|
||||||
## Опция HELP
|
## Опция HELP
|
||||||
Может быть вызвана как ```--help``` или ```-h```.
|
Может быть вызвана как ```--help``` или ```-h```.
|
||||||
Эта опция выводит краткую справку.
|
Эта опция выводит краткую справку.
|
||||||
@ -19,3 +20,7 @@
|
|||||||
## Опция DEBUG
|
## Опция DEBUG
|
||||||
Может быть вызвана как ```--debug``` или ```-d```.
|
Может быть вызвана как ```--debug``` или ```-d```.
|
||||||
Эта опция включает режим отладчика. В этом режиме комманды будут выполняться по запросу пользователя и создавать дамп памяти.
|
Эта опция включает режим отладчика. В этом режиме комманды будут выполняться по запросу пользователя и создавать дамп памяти.
|
||||||
|
## Опция MEM
|
||||||
|
Может быть вызвана как ```--mem``` или ```-m```.
|
||||||
|
Эта опция меняет размер памяти, выделяймой под программу при компиляции ассемблера.
|
||||||
|
Рекомендуется к использованию всегда.
|
||||||
@ -5,5 +5,7 @@
|
|||||||
> Это бета-версия. Документация ещё не готова.
|
> Это бета-версия. Документация ещё не готова.
|
||||||
- [Инструкция по установке](https://gitlabor.ru/German/ntsys/src/branch/main/INSTALL.md)
|
- [Инструкция по установке](https://gitlabor.ru/German/ntsys/src/branch/main/INSTALL.md)
|
||||||
- [Справочник по опциям](https://gitlabor.ru/German/ntsys/src/branch/main/OPTIONS.md)
|
- [Справочник по опциям](https://gitlabor.ru/German/ntsys/src/branch/main/OPTIONS.md)
|
||||||
- [Бинарная структура](https://gitlabor.ru/German/ntsys/src/branch/main/BINARY.md)
|
|
||||||
- [Двоичные коды комманд](https://gitlabor.ru/German/ntsys/src/branch/main/BINCOM.md)
|
- [Двоичные коды комманд](https://gitlabor.ru/German/ntsys/src/branch/main/BINCOM.md)
|
||||||
|
- [Ассемблер](https://gitlabor.ru/German/ntsys/src/branch/main/ASM.md)
|
||||||
|
- [Примеры](https://gitlabor.ru/German/ntsys/src/branch/main/EXAMPLES.md)
|
||||||
|
- [Бинарная структура](https://gitlabor.ru/German/ntsys/src/branch/main/BINARY.md)
|
||||||
11
asm-savers.h
11
asm-savers.h
@ -48,6 +48,7 @@ char* ntsys_get_str(char* ptr, FILE* fp) {
|
|||||||
while (i < strlen(ptr)) {
|
while (i < strlen(ptr)) {
|
||||||
if (ptr[i] == '"' && ptr[((i == 0) ? 1 : i) - 1] != '\\') {isStr = !isStr;}
|
if (ptr[i] == '"' && ptr[((i == 0) ? 1 : i) - 1] != '\\') {isStr = !isStr;}
|
||||||
if ((ptr[i] == ';' || ptr[i] == '#') && isStr == 0) ptr[i] = '\0';
|
if ((ptr[i] == ';' || ptr[i] == '#') && isStr == 0) ptr[i] = '\0';
|
||||||
|
if ((ptr[i] == ',') && isStr == 0) ptr[i] = ' ';
|
||||||
i ++;
|
i ++;
|
||||||
}
|
}
|
||||||
return ptr;
|
return ptr;
|
||||||
@ -73,8 +74,9 @@ static void __str_slice(char* str) {
|
|||||||
|
|
||||||
char* ntsys_get_arg(ntsys_asm_cache_t save) {
|
char* ntsys_get_arg(ntsys_asm_cache_t save) {
|
||||||
char* str = save->cache;
|
char* str = save->cache;
|
||||||
|
printf("Cache : %s\n", save->cache);
|
||||||
while (1) {
|
while (1) {
|
||||||
if (!is_space(str[0]) || str[0] == '\0') {
|
if ((!is_space(str[0])) || str[0] == '\0') {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
str ++;
|
str ++;
|
||||||
@ -89,9 +91,12 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) {
|
|||||||
}
|
}
|
||||||
n_p ++;
|
n_p ++;
|
||||||
}
|
}
|
||||||
save->cache = &str[n_p + 1];
|
byte_t t = 1;
|
||||||
|
if (n_p + t > strlen(str)) t = 0;
|
||||||
|
save->cache = &str[n_p + t];
|
||||||
str[n_p] = '\0';
|
str[n_p] = '\0';
|
||||||
}
|
}
|
||||||
|
printf("Switch : %s\n", save->cache);
|
||||||
if (str[strlen(str) - 1] == '\n' || str[strlen(str) - 1] == '\r') str[strlen(str) - 1] = '\0';
|
if (str[strlen(str) - 1] == '\n' || str[strlen(str) - 1] == '\r') str[strlen(str) - 1] = '\0';
|
||||||
if (strlen(str) == 0) {
|
if (strlen(str) == 0) {
|
||||||
str = NULL;
|
str = NULL;
|
||||||
@ -133,6 +138,7 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
save->string = str;
|
save->string = str;
|
||||||
|
printf("Loading : %s\n", str);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -396,6 +402,7 @@ int __ntsys_arg_function_loader(ntsys_argument_parser_t* parser) {
|
|||||||
if (select_argument(parser) == EXIT_FAILURE) return EXIT_FAILURE;
|
if (select_argument(parser) == EXIT_FAILURE) return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
if (parser->is_rewrite == 0) *parser->file_size = ftell(parser->fp) + 1;
|
if (parser->is_rewrite == 0) *parser->file_size = ftell(parser->fp) + 1;
|
||||||
|
fflush(parser->fp);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
example.exe
BIN
example.exe
Binary file not shown.
10
input.asm
Normal file
10
input.asm
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
main:
|
||||||
|
push.string "Введите ваше имя: " ; Строка
|
||||||
|
push byte 0x00
|
||||||
|
syscall
|
||||||
|
getch:
|
||||||
|
push db getch
|
||||||
|
push byte 0x01
|
||||||
|
syscall
|
||||||
|
push byte 0x0A
|
||||||
|
neq byte
|
||||||
@ -603,6 +603,14 @@ static void nt_fs_syscall(void) {
|
|||||||
cnt = __ntsys_buffer_size - 1;
|
cnt = __ntsys_buffer_size - 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 0x03:
|
||||||
|
{
|
||||||
|
if ((fGH6VSEzu7qNiGVE_stat = system((char*)stack + sp)) != EXIT_SUCCESS)
|
||||||
|
cnt = __ntsys_buffer_size - 1;
|
||||||
|
size_t len = strlen((char*)stack + sp);
|
||||||
|
sp += len;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
4
ntsys.h
4
ntsys.h
@ -84,7 +84,8 @@ static void __help(void) {
|
|||||||
" " "--version / -v - show version" "\n"
|
" " "--version / -v - show version" "\n"
|
||||||
" " "--asm / -a - compile assembler program" "\n"
|
" " "--asm / -a - compile assembler program" "\n"
|
||||||
" " "--out / -o - set output file name" "\n"
|
" " "--out / -o - set output file name" "\n"
|
||||||
" " "--debug / -d - display debugging info" "\0"
|
" " "--debug / -d - display debugging info" "\n"
|
||||||
|
" " "--mem / -m - asm output memory size" "\0"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
static int __exe_run(__e_byte_t* memory, unsigned int memorysize, unsigned long filesize, FILE* fp, __e_byte_t debug) {
|
static int __exe_run(__e_byte_t* memory, unsigned int memorysize, unsigned long filesize, FILE* fp, __e_byte_t debug) {
|
||||||
@ -230,6 +231,7 @@ int _lib_ntsys_main(int argc, char** argv) {
|
|||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
mem = 1;
|
mem = 1;
|
||||||
|
mode = 'A';
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ntsys_error("Unknown option!");
|
ntsys_error("Unknown option!");
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user