Makexm2c и Xmtwolime

завершено на 100%
Материал из Викиучебника — открытых книг для открытого мира


Введение[править]

Эта книга повествует о создании программ под 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__%

Примечания[править]