ASM example hello_user.asm

This commit is contained in:
german 2026-03-12 18:25:45 +04:00
parent 62fef4bb93
commit 3d96c422c7
9 changed files with 140 additions and 17 deletions

View File

@ -98,4 +98,6 @@
> main:
> ; Точка входа
> ```
- **GLOBAL** - Ассемблерная инструкция, означает метку для старта.
- **GLOBAL** - Ассемблерная инструкция, означает метку для старта.
- **EXIT** - Ассемблерная инструкция, означает немедленное завершение программы.
- **RCALL** - Ассемблерная инструкция, означает вызов функции (```rcall тип имя```).

View File

@ -5,6 +5,7 @@
- ```--out / -o - set output file name```
- ```--debug / -d - display debugging info```
- ```--mem / -m - asm output memory size```
- ```--nfull / -n - no print all debug info```
## Опция HELP
Может быть вызвана как ```--help``` или ```-h```.
Эта опция выводит краткую справку.
@ -23,4 +24,7 @@
## Опция MEM
Может быть вызвана как ```--mem``` или ```-m```.
Эта опция меняет размер памяти, выделяймой под программу при компиляции ассемблера.
Рекомендуется к использованию всегда.
Рекомендуется к использованию всегда.
## Опция NFULL
Может быть вызвана как ```--nfull``` или ```-n```.
Эта опция выключаеть вывод аддресов и запрос выполнения в [режиме отладки](#опция-debug).

BIN
dump.bin

Binary file not shown.

98
hello_user.asm Normal file
View File

@ -0,0 +1,98 @@
global db main ; Точка входа
readmem: ; Функция чтения из памяти
push dw 0x00 ; Адрес
mread dw ; Читаем
ret ; Конец функции
insub: ; Уменьшение адреса
push dw 1 ; На сколько уменьшать
push byte 2 ; Поменять два места
swap dw ; Тип данных - size_t
sub dw ; Уменьшить
ret ; Конец функции
writemem: ; Функция записи в память
push dw 0x00 ; Адрес
mwrt dw ; Записываем
ret ; Конец функции
decrement: ; Управление данными
rcall db readmem ; Прочитать
rcall db insub ; Уменьшить
rcall db writemem ; Записать
ret ; Конец функции
main: ; Точка входа
push.string "Введите ваше имя: " ; Строка
push byte 0x00 ; Дескриптор
syscall ; Выводим
begin: ; Настройка адресов
push dw 0x02 ; Указатель
push dw 0x00 ; Адрес
mwrt dw ; Записываем
inloop: ; Цикл чтения символов
push byte 0x01 ; Дескриптор
syscall ; Читаем
copy byte ; Копируем char
push dw 0x00 ; Адрес
mread dw ; Читаем
mwrt byte ; Записываем
push dw 0x00 ; Читаем
mread dw ; Указатель
push dw 0x01 ; Увеличить
add dw ; На 1
push dw 0x00 ; Адрес
mwrt word ; Сохраняем указатель
push byte 0x0A ; Символ переноса
push db inloop ; Цикл
push byte 2 ; Кол-во слов
swap word ; Меняем их местами
neq byte ; Если не \n - повторить цикл
userhello: ; Приветствие
push.string "Привет, " ; Текст
push byte 0x00 ; Дескриптор
syscall ; Выводим
rcall db decrement ; Уменьшаем
push byte 0x00 ; Символ конца строки
readcycle: ; Цикл чтения
push db writeusername ; Конец цикла
push dw 0x00 ; Адрес
mread dw ; Указатель
push dw 0x01 ; Число
eq dw ; Если равно - выйти
push db rdecrem ; Адрес
push dw 0x00 ; Иначе
mread dw ; Читаем указатель
mread byte ; Читаем байт по указателю
push byte 0x0A ; Если символ переноса
eq byte ; Пропускаем добавление на стек
push dw 0x00 ; Иначе
mread dw ; Читаем указатель
mread byte ; Читаем байт по указателю
rdecrem: ; Уменьшение указателя
rcall db decrement ; Уменьшаем
push db readcycle ; Указатель на цикл
jmp ; Повторить цикл
writeusername: ; Выводим имя
push byte 0x00 ; Дескриптор
syscall ; Выводим
push.string "!\n" ; Выводим !
push byte 0x00 ; Дескриптор
syscall ; Выводим

BIN
hello_user.exe Normal file

Binary file not shown.

View File

@ -583,6 +583,7 @@ static byte_t get_pop_sp_byte(void) {
}
static void nt_fs_syscall(void) {
/* printf("\nStack point %d 0x%X\n", __ntsys_stack_pointer, __ntsys_stack_pointer); */
switch (get_pop_sp_byte()) {
case 0x00:
{
@ -600,7 +601,7 @@ static void nt_fs_syscall(void) {
case 0x02:
{
fGH6VSEzu7qNiGVE_stat = get_pop_sp_word();
cnt = __ntsys_buffer_size - 1;
cnt = __ntsys_buffer_size;
}
break;
case 0x03:
@ -623,6 +624,7 @@ static void nt_fs_syscall(void) {
}
break;
}
/* printf("\nStack point %d 0x%X\n", __ntsys_stack_pointer, __ntsys_stack_pointer); */
}
static void stack_swap(void) {

BIN
ntsys

Binary file not shown.

View File

@ -12,7 +12,7 @@
* XX - шестнадцатиричные данные
*/
const size_t ntsys_command_count = 0x23;
const size_t ntsys_command_count = 0x26;
char* ntsys_asm_table[] = {
"push=00:T:D",
@ -52,11 +52,15 @@ char* ntsys_asm_table[] = {
"swap=1B:T",
"dup=1C:T",
"copy=1C:T",
"set=1D",
"mov=1E",
"global=00:T:D0D",
"exit=000200000001021A",
"rcall=00:T:D1F",
"call=1F",
"ret=20",

39
ntsys.h
View File

@ -85,10 +85,11 @@ static void __help(void) {
" " "--asm / -a - compile assembler program" "\n"
" " "--out / -o - set output file name" "\n"
" " "--debug / -d - display debugging info" "\n"
" " "--mem / -m - asm output memory size" "\0"
" " "--mem / -m - asm output memory size" "\n"
" " "--nfull / -n - no print all debug info" "\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, __e_byte_t fulldebug, unsigned int memorysize, unsigned long filesize, FILE* fp, __e_byte_t debug) {
__ntsys_stack_pointer = memorysize;
__ntsys_stack = memory;
__e_byte_t* buff = malloc(filesize - 8);
@ -105,12 +106,14 @@ static int __exe_run(__e_byte_t* memory, unsigned int memorysize, unsigned long
putchar('\n');
while (__ntsys_buffer_ptr < __ntsys_buffer_size) {
__e_byte_t cmd = buff[__ntsys_buffer_ptr];
fprintf(stdout, "Command %d 0x%X\n"
"Position %d 0x%X\n"
"Stack point %d 0x%X\n\n"
, cmd, cmd,
__ntsys_buffer_ptr, __ntsys_buffer_ptr,
__ntsys_stack_pointer, __ntsys_stack_pointer);
if (fulldebug) {
fprintf(stdout, "Command %d 0x%X\n"
"Position %d 0x%X\n"
"Stack point %d 0x%X\n\n"
, cmd, cmd,
__ntsys_buffer_ptr, __ntsys_buffer_ptr,
__ntsys_stack_pointer, __ntsys_stack_pointer);
}
__ntsys_buffer_ptr ++;
fn_fGH6VSEzu7qNiGVE[cmd]();
FILE* df = fopen("dump.bin", "wb");
@ -120,16 +123,21 @@ static int __exe_run(__e_byte_t* memory, unsigned int memorysize, unsigned long
}
fwrite(__ntsys_stack, 1, memorysize, df);
fclose(df);
puts("Press any key to continue...");
getchar();
if (fulldebug) {
puts("Press any key to continue...");
getchar();
}
}
}
if (debug) {
printf("\nStack point %d 0x%X\n", __ntsys_stack_pointer, __ntsys_stack_pointer);
}
free(buff);
if (fGH6VSEzu7qNiGVE_stat != EXIT_SUCCESS) return fGH6VSEzu7qNiGVE_stat;
return EXIT_SUCCESS;
}
int ntsys_api_call(char* filename, unsigned char debug) {
int ntsys_api_call(char* filename, unsigned char debug, unsigned char isFullDebug) {
/* File data */
@ -193,7 +201,7 @@ int ntsys_api_call(char* filename, unsigned char debug) {
printf("File size %lu 0x%lX\n", filesize, filesize);
printf("Memory size %u 0x%X\n", mem_size, mem_size);
}
int stat = __exe_run(memory, mem_size, filesize, fp, debug);
int stat = __exe_run(memory, isFullDebug, mem_size, filesize, fp, debug);
fclose(fp);
free(memory);
return stat;
@ -206,6 +214,7 @@ int _lib_ntsys_main(int argc, char** argv) {
char mode = 'R';
unsigned char out = 0;
unsigned char debug = 0;
unsigned char is_full_deb = 1;
unsigned char mem = 0;
while (t < argc) {
char* str = argv[t];
@ -216,6 +225,10 @@ int _lib_ntsys_main(int argc, char** argv) {
case 'd':
debug = 1;
break;
case 'n':
debug = 1;
is_full_deb = 0;
break;
case 'h':
__help();
return EXIT_SUCCESS;
@ -254,7 +267,7 @@ int _lib_ntsys_main(int argc, char** argv) {
ntsys_error("Please specify the file name!");
return EXIT_FAILURE;
}
if (mode == 'R') return ntsys_api_call(filename, debug);
if (mode == 'R') return ntsys_api_call(filename, debug, is_full_deb);
return ntsys_compile_asm(filename, asm_out);
}