Makexm2c и Xmtwolime
Введение[править]
Эта книга повествует о создании программ под Xmtwolime, используя язык Makexm2c. Можете считать её продолжением учебника Makexm2c.
Вид[править]
Xmtwolime-программы имеют следующий вид:
; ...
имяпрограммы:
; код
Имя программы должно состоять ровно из трёх ASCII-символов![1] Всегда начинайте метки и им. константы программы с её названия!
Hello, world![править]
Переместитесь в каталог xmtwolime. Создайте файл software/hey.s со следующим содержимым:
hey:
vstr %OUT_ST%, "Hello, world!"
mov %R_RETURN_CODE%, 0
%__END_THE_APP__%
Это Makexm2c-программа для Xmtwolime. Соберите систему, запустите её в виртуальной машине. Наберите в оболочке «hey», на экране должно появится «Hello, world!».
Им. константы[2][править]
Имена | Описание |
---|---|
%R_USER% | п. регистр, содержащий текущий UID (идентификатор пользователя); 1 — обычный пользователь, 0 — root |
%R_FA_0%..%R_FA_10% | п. регистры для приложений, используйте их |
%R_RETURN_CODE% | п. регистр, который хранит код возврата программы |
%__END_THE_APP__% | завершение программы и возвращение к оболочке; используйте только в основном потоке, другие потоки должны быть завершены |
%ARGS_ST% | начало аргументов программы в видеопамяти |
%R_ZERO% | п. регистр, который должен содержать только ноль |
%ORDINARY_USER_SPACE_ST% и %ORDINARY_USER_SPACE_ND% | начало и конец данных обычного пользователя в памяти |
%OUT_ST% | начало вывода программы в видеопамяти |
%R_KEY% | п. регистр 1, в который сохраняется нажатая клавиша |
Безопасность[править]
Программы находятся в разделе system и имеют полный доступ к памяти, независимо от UID. Создавайте безопасное ПО!
Получение числа из аргумента в форме ЦЦЦЦЦЦЦ (например, 0001024) и сохранение его в п. регистр %R_FA_0%[править]
mov %R_FA_8%, 48
vld 0006, %R_FA_1%
sub %R_FA_1% %R_FA_8%, %R_FA_1%
vld 0007, %R_FA_2%
sub %R_FA_2% %R_FA_8%, %R_FA_2%
vld 0008, %R_FA_3%
sub %R_FA_3% %R_FA_8%, %R_FA_3%
vld 0009, %R_FA_4%
sub %R_FA_4% %R_FA_8%, %R_FA_4%
vld 0010, %R_FA_5%
sub %R_FA_5% %R_FA_8%, %R_FA_5%
vld 0011, %R_FA_6%
sub %R_FA_6% %R_FA_8%, %R_FA_6%
vld 0012, %R_FA_7%
sub %R_FA_7% %R_FA_8%, %R_FA_7%
mov3 %R_FA_0%, %R_FA_2% %R_FA_3% %R_FA_4% %R_FA_5% %R_FA_6% %R_FA_7%
mov2 %R_FA_2%, 1000000
mul %R_FA_2% %R_FA_1%, %R_FA_1%
add %R_FA_0% %R_FA_1%, %R_FA_0%
Пример программы[править]
;; игра
gam:
mov2 %R_FA_0%, 0000190
mov %R_FA_10%, 100
vstr 0126, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
vstr 0189, "@P...............@..@.....................@.....@"
vstr 0252, "@................@..@...................@...@...@"
vstr 0315, "@.....@@@@@@@@@@@@@.@.................@@@@@@@@..@"
vstr 0378, "@...................@.............@@@@@.........@"
vstr 0441, "@....@@@@@@@@@@@@@@...@@@@@@@@@@@@@.............@"
vstr 0504, "@....@.............@..@.........................@"
vstr 0567, "@....@........@.....@..@...........@@@..........@"
vstr 0630, "@....@@@@@@@@@@......@..@..........@.....@@@@@@@@"
vstr 0693, "@.....................@..@.........@............@"
vstr 0756, "@.........................@..............@......@"
vstr 0819, "@@@@@@@@@@@@....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...@"
vstr 0882, "@....................@..........................@"
vstr 0945, "@..........@.........@.......................@@@@"
vstr 1008, "@..........@.........@..........................@"
vstr 1071, "@..........@.........,........................,................"
vstr 1134, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
updd
gam_main:
lslp %R_FA_10%
mov2 %R_FA_1%, <gam_main>
if %R_KEY% == %R_ZERO%, %R_FA_1%
mov %R_FA_1%, 'w'
mov2 %R_FA_2%, <gam_w>
if %R_KEY% == %R_FA_1%, %R_FA_2%
mov %R_FA_1%, 'a'
mov2 %R_FA_2%, <gam_a>
if %R_KEY% == %R_FA_1%, %R_FA_2%
mov %R_FA_1%, 's'
mov2 %R_FA_2%, <gam_s>
if %R_KEY% == %R_FA_1%, %R_FA_2%
mov %R_FA_1%, 'd'
mov2 %R_FA_2%, <gam_d>
if %R_KEY% == %R_FA_1%, %R_FA_2%
mov %R_FA_1%, 27
mov2 %R_FA_2%, <gam_end>
if %R_KEY% == %R_FA_1%, %R_FA_2%
gam_main_continue:
vstr 0126, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
vstr 0189, "@................@..@.....................@.....@"
vstr 0252, "@................@..@...................@...@...@"
vstr 0315, "@.....@@@@@@@@@@@@@.@.................@@@@@@@@..@"
vstr 0378, "@...................@.............@@@@@.........@"
vstr 0441, "@....@@@@@@@@@@@@@@...@@@@@@@@@@@@@.............@"
vstr 0504, "@....@.............@..@.........................@"
vstr 0567, "@....@........@.....@..@...........@@@..........@"
vstr 0630, "@....@@@@@@@@@@......@..@..........@.....@@@@@@@@"
vstr 0693, "@.....................@..@.........@............@"
vstr 0756, "@.........................@..............@......@"
vstr 0819, "@@@@@@@@@@@@....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...@"
vstr 0882, "@....................@..........................@"
vstr 0945, "@..........@.........@.......................@@@@"
vstr 1008, "@..........@.........@..........................@"
vstr 1071, "@..........@.........,........................,................"
vstr 1134, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
vld %R_FA_0%, %R_FA_1%
mov2 %R_FA_2%, <gam_end>
mov %R_FA_3%, '.'
if %R_FA_1% != %R_FA_3%, %R_FA_2%
mov %R_FA_1%, 'P'
vsv %R_FA_1%, %R_FA_0%
updd
mov %R_KEY%, 0
mov2 %R_FA_1%, <gam_main>
jmp %R_FA_1%
gam_w:
mov %R_FA_1%, 63
sub %R_FA_0% %R_FA_1%, %R_FA_0%
mov2 %R_FA_1%, <gam_main_continue>
jmp %R_FA_1%
gam_a:
dec %R_FA_0%
mov2 %R_FA_1%, <gam_main_continue>
jmp %R_FA_1%
gam_s:
mov %R_FA_1%, 63
add %R_FA_0% %R_FA_1%, %R_FA_0%
mov2 %R_FA_1%, <gam_main_continue>
jmp %R_FA_1%
gam_d:
inc %R_FA_0%
mov2 %R_FA_1%, <gam_main_continue>
jmp %R_FA_1%
gam_end:
%__END_THE_APP__%