Examples
This commit is contained in:
parent
68612c69b0
commit
07f94ba9d8
2
ASM.md
2
ASM.md
@ -41,4 +41,4 @@ main:
|
||||
```
|
||||
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 РАЗМЕР**
|
||||
### Работа с памятью
|
||||
> [!NOTE]
|
||||
> Комманда для записи в память получает аддрес в **ARG1**, а размер - в **ARG2**.
|
||||
> Комманда для записи в память получает адрес в **ARG1**, а данные - в **ARG2**.
|
||||
- **MWRT 0x16** - Запись **ARG1 ARG2** - сначала берётся **ARG1**. Формат: **0x16 РАЗМЕР**
|
||||
- **MREAD 0x17** - Чтение **ARG**. Формат: **0x17 РАЗМЕР**
|
||||
## Работа с указателем
|
||||
@ -95,4 +95,7 @@ void (*operations[])(void) = {
|
||||
> - Вывод строки (Запись на стек строки и числа **0x00**)
|
||||
> - Ввод символа (Запись на стек **0x01**)
|
||||
> - Завершение со статусом (Запись на стек **WORD-статуса** и числа **0x02**)
|
||||
> - Вызов BASH (Запись на стек строки и числа **0x03**)
|
||||
> - Запрос к RANDOM (Запись на стек числа **0x04**)
|
||||
> - Установка SEED (Запись на стек **WORD-SEED** и числа **0x05**)
|
||||
- **SYSCALL 0x1A** - Выполнить вызов к ядру (**ARG**). Формат: **0x1A**
|
||||
51
EXAMPLES.md
51
EXAMPLES.md
@ -1,5 +1,8 @@
|
||||
# Примеры на ассемблере NTSYS
|
||||
Это небольшой набор примеров для ассемблера NTSYS.
|
||||
Это небольшой набор примеров для ассемблера NTSYS. Для их компиляции используйте:
|
||||
```bash
|
||||
ntsys --asm имя_файла.asm --out имя_файла.exe --mem 128
|
||||
```
|
||||
## Hello, world!
|
||||
```asm
|
||||
main: ; Метка main
|
||||
@ -7,16 +10,40 @@ main: ; Метка main
|
||||
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
|
||||
main: ; Метка main
|
||||
push.string "echo \"Ваше имя: $USER\"\n" ; Запрос к системе
|
||||
push byte, 0x03 ; Код
|
||||
syscall ; Вызов
|
||||
```
|
||||
## Пример программной задержки
|
||||
```asm
|
||||
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 ; Повторяем цикл
|
||||
```
|
||||
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 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) {
|
||||
if (ptr != NULL) {
|
||||
free(ptr);
|
||||
@ -26,12 +35,19 @@ char* ntsys_get_str(char* ptr, FILE* fp) {
|
||||
int c;
|
||||
{
|
||||
unsigned long save_ptr = ftell(fp);
|
||||
__e_byte_t tr = 0;
|
||||
while (__READ_FILE_WITH_EOF_OR_LN) {
|
||||
if (!is_space(c)) tr = 1;
|
||||
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);
|
||||
}
|
||||
if (len == 0) return NULL;
|
||||
ptr = malloc(len + 1);
|
||||
if (ptr == NULL) {
|
||||
ntsys_error("Out of memory!");
|
||||
@ -51,6 +67,11 @@ char* ntsys_get_str(char* ptr, FILE* fp) {
|
||||
if ((ptr[i] == ',') && isStr == 0) ptr[i] = ' ';
|
||||
i ++;
|
||||
}
|
||||
if (strlen(ptr) == 0 || is_spaces(ptr)) {
|
||||
free(ptr);
|
||||
ptr = malloc(5 * sizeof(char));
|
||||
return strcpy(ptr, "pass");
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
||||
@ -123,6 +144,7 @@ char* ntsys_get_arg(ntsys_asm_cache_t save) {
|
||||
case 'v': str[i] = '\v'; break;
|
||||
case 'f': str[i] = '\f'; break;
|
||||
case 'r': str[i] = '\r'; break;
|
||||
case '"': str[i] = '"'; break;
|
||||
default:
|
||||
ntsys_error("Unknown ident!");
|
||||
str = NULL;
|
||||
@ -197,7 +219,7 @@ static void __write_label(ntsys_argument_parser_t* parser) {
|
||||
size_t i = 0;
|
||||
/* printf("Count: 0x%04lX\n", *(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) {
|
||||
word_t cnt = parser->labels_positions[i];
|
||||
int __i = 1;
|
||||
|
||||
10
input.asm
10
input.asm
@ -1,10 +1,4 @@
|
||||
main:
|
||||
push.string "Введите ваше имя: " ; Строка
|
||||
push byte, 0x00
|
||||
push.string "echo \"Ваше имя: $USER\"\n"
|
||||
push byte, 0x03
|
||||
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:
|
||||
{
|
||||
char ch = getchar();
|
||||
pop_arg(1, (__e_byte_t*)&ch);
|
||||
push_arg(1, (__e_byte_t*)&ch);
|
||||
}
|
||||
break;
|
||||
case 0x02:
|
||||
@ -611,6 +611,17 @@ static void nt_fs_syscall(void) {
|
||||
sp += len;
|
||||
}
|
||||
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 - шестнадцатиричные данные
|
||||
*/
|
||||
|
||||
const size_t ntsys_command_count = 0x1B;
|
||||
const size_t ntsys_command_count = 0x1C;
|
||||
|
||||
char* ntsys_asm_table[] = {
|
||||
"push=00:T:D",
|
||||
@ -48,14 +48,15 @@ char* ntsys_asm_table[] = {
|
||||
"getsp=18",
|
||||
"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) {
|
||||
ntsys_asm_save_t __save = create_ntsys_asm_save(str);
|
||||
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);
|
||||
/*puts(str);*/
|
||||
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