Examples
This commit is contained in:
parent
68612c69b0
commit
07f94ba9d8
2
ASM.md
2
ASM.md
@ -41,4 +41,4 @@ main:
|
|||||||
```
|
```
|
||||||
push.string "Строка"
|
push.string "Строка"
|
||||||
```
|
```
|
||||||
Поддерживаются следующие управляющие символы: ```\0, \a, \b, \t, \n, \v, \f, \r, \\, \"```.
|
Поддерживаются следующие управляющие символы: ```\0, \a, \b, \t, \n, \v, \f, \r, \\, \", \'```.
|
||||||
|
|||||||
@ -83,7 +83,7 @@ void (*operations[])(void) = {
|
|||||||
- **DOWNE 0x15** - Не меньше (больше или равно) **ARG1 >= ARG2** - сначала берётся **ARG1**. Формат: **0x15 РАЗМЕР**
|
- **DOWNE 0x15** - Не меньше (больше или равно) **ARG1 >= ARG2** - сначала берётся **ARG1**. Формат: **0x15 РАЗМЕР**
|
||||||
### Работа с памятью
|
### Работа с памятью
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Комманда для записи в память получает аддрес в **ARG1**, а размер - в **ARG2**.
|
> Комманда для записи в память получает адрес в **ARG1**, а данные - в **ARG2**.
|
||||||
- **MWRT 0x16** - Запись **ARG1 ARG2** - сначала берётся **ARG1**. Формат: **0x16 РАЗМЕР**
|
- **MWRT 0x16** - Запись **ARG1 ARG2** - сначала берётся **ARG1**. Формат: **0x16 РАЗМЕР**
|
||||||
- **MREAD 0x17** - Чтение **ARG**. Формат: **0x17 РАЗМЕР**
|
- **MREAD 0x17** - Чтение **ARG**. Формат: **0x17 РАЗМЕР**
|
||||||
## Работа с указателем
|
## Работа с указателем
|
||||||
@ -95,4 +95,7 @@ void (*operations[])(void) = {
|
|||||||
> - Вывод строки (Запись на стек строки и числа **0x00**)
|
> - Вывод строки (Запись на стек строки и числа **0x00**)
|
||||||
> - Ввод символа (Запись на стек **0x01**)
|
> - Ввод символа (Запись на стек **0x01**)
|
||||||
> - Завершение со статусом (Запись на стек **WORD-статуса** и числа **0x02**)
|
> - Завершение со статусом (Запись на стек **WORD-статуса** и числа **0x02**)
|
||||||
|
> - Вызов BASH (Запись на стек строки и числа **0x03**)
|
||||||
|
> - Запрос к RANDOM (Запись на стек числа **0x04**)
|
||||||
|
> - Установка SEED (Запись на стек **WORD-SEED** и числа **0x05**)
|
||||||
- **SYSCALL 0x1A** - Выполнить вызов к ядру (**ARG**). Формат: **0x1A**
|
- **SYSCALL 0x1A** - Выполнить вызов к ядру (**ARG**). Формат: **0x1A**
|
||||||
51
EXAMPLES.md
51
EXAMPLES.md
@ -1,5 +1,8 @@
|
|||||||
# Примеры на ассемблере NTSYS
|
# Примеры на ассемблере NTSYS
|
||||||
Это небольшой набор примеров для ассемблера NTSYS.
|
Это небольшой набор примеров для ассемблера NTSYS. Для их компиляции используйте:
|
||||||
|
```bash
|
||||||
|
ntsys --asm имя_файла.asm --out имя_файла.exe --mem 128
|
||||||
|
```
|
||||||
## Hello, world!
|
## Hello, world!
|
||||||
```asm
|
```asm
|
||||||
main: ; Метка main
|
main: ; Метка main
|
||||||
@ -7,16 +10,40 @@ main: ; Метка main
|
|||||||
push byte, 0x00 ; Запись номера SYSCALL
|
push byte, 0x00 ; Запись номера SYSCALL
|
||||||
syscall ; Системный вызов
|
syscall ; Системный вызов
|
||||||
```
|
```
|
||||||
## Читаем имя пользователя
|
## Выводим имя пользователя
|
||||||
```asm
|
```asm
|
||||||
main:
|
main: ; Метка main
|
||||||
push.string "Введите ваше имя: " ; Строка
|
push.string "echo \"Ваше имя: $USER\"\n" ; Запрос к системе
|
||||||
push byte, 0x00
|
push byte, 0x03 ; Код
|
||||||
syscall
|
syscall ; Вызов
|
||||||
getch:
|
```
|
||||||
push db getch
|
## Пример программной задержки
|
||||||
push byte, 0x01
|
```asm
|
||||||
syscall
|
main: ; Метка main
|
||||||
push byte, 0x0A
|
push.string "This is example of wait!\n" ; Строка
|
||||||
neq byte
|
push byte, 0x00 ; Номер
|
||||||
|
syscall ; Системный вызов
|
||||||
|
|
||||||
|
mload: ; Функция mload
|
||||||
|
push word, 0x00 ; Данные для записи
|
||||||
|
push word, 0x00 ; Адрес в VRAM
|
||||||
|
mwrt word ; Комманда записи
|
||||||
|
|
||||||
|
lwait: ; Цикл задержки
|
||||||
|
push db, lwait ; Его адрес
|
||||||
|
push word, 0x01 ; Увеличивать счетчик на 1
|
||||||
|
push word, 0x00 ; Счетчик по адресу 0x00
|
||||||
|
mread word ; Читаем
|
||||||
|
add word ; Складываем
|
||||||
|
push word, 0x00 ; Адрес для записи
|
||||||
|
mwrt word ; Записываем обратно
|
||||||
|
push word, 0x00 ; Адрес
|
||||||
|
mread word ; Читаем
|
||||||
|
push word, 0xFFFF ; Значение для сравнения
|
||||||
|
neq word ; Если не равно - повторить цикл
|
||||||
|
|
||||||
|
mloop: ; Главный цикл
|
||||||
|
pop byte ; Убираем оставщийся байт
|
||||||
|
push db, main ; Адрес main
|
||||||
|
jmp ; Повторяем цикл
|
||||||
```
|
```
|
||||||
26
asm-savers.h
26
asm-savers.h
@ -18,6 +18,15 @@
|
|||||||
#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)
|
||||||
|
|
||||||
|
static byte_t is_spaces(char* str) {
|
||||||
|
size_t pos = 0;
|
||||||
|
while (pos < strlen(str)) {
|
||||||
|
if (!is_space(str[pos])) return 0;
|
||||||
|
pos ++;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
char* ntsys_get_str(char* ptr, FILE* fp) {
|
char* ntsys_get_str(char* ptr, FILE* fp) {
|
||||||
if (ptr != NULL) {
|
if (ptr != NULL) {
|
||||||
free(ptr);
|
free(ptr);
|
||||||
@ -26,12 +35,19 @@ char* ntsys_get_str(char* ptr, FILE* fp) {
|
|||||||
int c;
|
int c;
|
||||||
{
|
{
|
||||||
unsigned long save_ptr = ftell(fp);
|
unsigned long save_ptr = ftell(fp);
|
||||||
|
__e_byte_t tr = 0;
|
||||||
while (__READ_FILE_WITH_EOF_OR_LN) {
|
while (__READ_FILE_WITH_EOF_OR_LN) {
|
||||||
|
if (!is_space(c)) tr = 1;
|
||||||
len ++;
|
len ++;
|
||||||
}
|
}
|
||||||
|
if (tr == 0) len = 0;
|
||||||
|
if (len == 0 && c == EOF) return NULL;
|
||||||
|
if (len == 0) {
|
||||||
|
ptr = malloc(5 * sizeof(char));
|
||||||
|
return strcpy(ptr, "pass");
|
||||||
|
}
|
||||||
fseek(fp, save_ptr, SEEK_SET);
|
fseek(fp, save_ptr, SEEK_SET);
|
||||||
}
|
}
|
||||||
if (len == 0) return NULL;
|
|
||||||
ptr = malloc(len + 1);
|
ptr = malloc(len + 1);
|
||||||
if (ptr == NULL) {
|
if (ptr == NULL) {
|
||||||
ntsys_error("Out of memory!");
|
ntsys_error("Out of memory!");
|
||||||
@ -51,6 +67,11 @@ char* ntsys_get_str(char* ptr, FILE* fp) {
|
|||||||
if ((ptr[i] == ',') && isStr == 0) ptr[i] = ' ';
|
if ((ptr[i] == ',') && isStr == 0) ptr[i] = ' ';
|
||||||
i ++;
|
i ++;
|
||||||
}
|
}
|
||||||
|
if (strlen(ptr) == 0 || is_spaces(ptr)) {
|
||||||
|
free(ptr);
|
||||||
|
ptr = malloc(5 * sizeof(char));
|
||||||
|
return strcpy(ptr, "pass");
|
||||||
|
}
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,6 +144,7 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) {
|
|||||||
case 'v': str[i] = '\v'; break;
|
case 'v': str[i] = '\v'; break;
|
||||||
case 'f': str[i] = '\f'; break;
|
case 'f': str[i] = '\f'; break;
|
||||||
case 'r': str[i] = '\r'; break;
|
case 'r': str[i] = '\r'; break;
|
||||||
|
case '"': str[i] = '"'; break;
|
||||||
default:
|
default:
|
||||||
ntsys_error("Unknown ident!");
|
ntsys_error("Unknown ident!");
|
||||||
str = NULL;
|
str = NULL;
|
||||||
@ -197,7 +219,7 @@ static void __write_label(ntsys_argument_parser_t* parser) {
|
|||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
/* printf("Count: 0x%04lX\n", *(parser->labels_count)); */
|
/* printf("Count: 0x%04lX\n", *(parser->labels_count)); */
|
||||||
while (i < *(parser->labels_count)) {
|
while (i < *(parser->labels_count)) {
|
||||||
/* printf("Label: \"%s\" to \"%s\"\n", parser->string, parser->labels[i]); */
|
/* printf("Label: \"%s\" to \"%s\" at 0x%08X\n", parser->string, parser->labels[i], parser->labels_positions[i]); */
|
||||||
if (strcmp(parser->string, parser->labels[i]) == 0) {
|
if (strcmp(parser->string, parser->labels[i]) == 0) {
|
||||||
word_t cnt = parser->labels_positions[i];
|
word_t cnt = parser->labels_positions[i];
|
||||||
int __i = 1;
|
int __i = 1;
|
||||||
|
|||||||
10
input.asm
10
input.asm
@ -1,10 +1,4 @@
|
|||||||
main:
|
main:
|
||||||
push.string "Введите ваше имя: " ; Строка
|
push.string "echo \"Ваше имя: $USER\"\n"
|
||||||
push byte, 0x00
|
push byte, 0x03
|
||||||
syscall
|
syscall
|
||||||
getch:
|
|
||||||
push db, getch
|
|
||||||
push byte, 0x01
|
|
||||||
syscall
|
|
||||||
push byte, 0x0A
|
|
||||||
neq byte
|
|
||||||
|
|||||||
13
ntfiles.h
13
ntfiles.h
@ -594,7 +594,7 @@ static void nt_fs_syscall(void) {
|
|||||||
case 0x01:
|
case 0x01:
|
||||||
{
|
{
|
||||||
char ch = getchar();
|
char ch = getchar();
|
||||||
pop_arg(1, (__e_byte_t*)&ch);
|
push_arg(1, (__e_byte_t*)&ch);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x02:
|
case 0x02:
|
||||||
@ -611,6 +611,17 @@ static void nt_fs_syscall(void) {
|
|||||||
sp += len;
|
sp += len;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 0x04:
|
||||||
|
{
|
||||||
|
__e_byte_t ch = rand() % 255;
|
||||||
|
push_arg(1, (__e_byte_t*)&ch);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x05:
|
||||||
|
{
|
||||||
|
srand(get_pop_sp_word());
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
* XX - шестнадцатиричные данные
|
* XX - шестнадцатиричные данные
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const size_t ntsys_command_count = 0x1B;
|
const size_t ntsys_command_count = 0x1C;
|
||||||
|
|
||||||
char* ntsys_asm_table[] = {
|
char* ntsys_asm_table[] = {
|
||||||
"push=00:T:D",
|
"push=00:T:D",
|
||||||
@ -48,14 +48,15 @@ char* ntsys_asm_table[] = {
|
|||||||
"getsp=18",
|
"getsp=18",
|
||||||
"setsp=19",
|
"setsp=19",
|
||||||
|
|
||||||
"syscall=1A"
|
"syscall=1A",
|
||||||
|
|
||||||
|
"pass="
|
||||||
};
|
};
|
||||||
|
|
||||||
int ntsys_asm_from_string(size_t* mempos, char* str, FILE* fp, byte_t cycle, ntsys_labels_array_t labels, word_t* labels_pos, size_t* labels_count, dword_t* fsz) {
|
int ntsys_asm_from_string(size_t* mempos, char* str, FILE* fp, byte_t cycle, ntsys_labels_array_t labels, word_t* labels_pos, size_t* labels_count, dword_t* fsz) {
|
||||||
ntsys_asm_save_t __save = create_ntsys_asm_save(str);
|
ntsys_asm_save_t __save = create_ntsys_asm_save(str);
|
||||||
ntsys_asm_cache_t __cache = create_ntsys_asm_cache(__save);
|
ntsys_asm_cache_t __cache = create_ntsys_asm_cache(__save);
|
||||||
ntsys_argument_parser_t parser = create_ntsys_asm_parser(__cache, fp, str, ntsys_asm_table, ntsys_command_count, labels, labels_pos, labels_count, cycle, fsz);
|
ntsys_argument_parser_t parser = create_ntsys_asm_parser(__cache, fp, str, ntsys_asm_table, ntsys_command_count, labels, labels_pos, labels_count, cycle, fsz);
|
||||||
/*puts(str);*/
|
|
||||||
return ntsys_run_asm_parser(parser);
|
return ntsys_run_asm_parser(parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
random.exe
Normal file
BIN
random.exe
Normal file
Binary file not shown.
27
wait.asm
Normal file
27
wait.asm
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
main: ; Метка main
|
||||||
|
push.string "This is example of wait!\n" ; Строка
|
||||||
|
push byte, 0x00 ; Номер
|
||||||
|
syscall ; Системный вызов
|
||||||
|
|
||||||
|
mload: ; Функция mload
|
||||||
|
push word, 0x00 ; Данные для записи
|
||||||
|
push word, 0x00 ; Адрес в VRAM
|
||||||
|
mwrt word ; Комманда записи
|
||||||
|
|
||||||
|
lwait: ; Цикл задержки
|
||||||
|
push db, lwait ; Его адрес
|
||||||
|
push word, 0x01 ; Увеличивать счетчик на 1
|
||||||
|
push word, 0x00 ; Счетчик по адресу 0x00
|
||||||
|
mread word ; Читаем
|
||||||
|
add word ; Складываем
|
||||||
|
push word, 0x00 ; Адрес для записи
|
||||||
|
mwrt word ; Записываем обратно
|
||||||
|
push word, 0x00 ; Адрес
|
||||||
|
mread word ; Читаем
|
||||||
|
push word, 0xFFFF ; Значение для сравнения
|
||||||
|
neq word ; Если не равно - повторить цикл
|
||||||
|
|
||||||
|
mloop: ; Главный цикл
|
||||||
|
pop byte ; Убираем оставщийся байт
|
||||||
|
push db, main ; Адрес main
|
||||||
|
jmp ; Повторяем цикл
|
||||||
Loading…
x
Reference in New Issue
Block a user