<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.ss13.ru/index.php?action=history&amp;feed=atom&amp;title=Guide_to_Nano-RISC</id>
	<title>Guide to Nano-RISC - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ss13.ru/index.php?action=history&amp;feed=atom&amp;title=Guide_to_Nano-RISC"/>
	<link rel="alternate" type="text/html" href="https://wiki.ss13.ru/index.php?title=Guide_to_Nano-RISC&amp;action=history"/>
	<updated>2026-05-01T15:39:18Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.35.9</generator>
	<entry>
		<id>https://wiki.ss13.ru/index.php?title=Guide_to_Nano-RISC&amp;diff=36935&amp;oldid=prev</id>
		<title>Igorsaux: Новая страница: «{{Заготовка}}  = Nano-RISC =  Nano-RISC - архитектура процессора, используемая в интегральных платах....»</title>
		<link rel="alternate" type="text/html" href="https://wiki.ss13.ru/index.php?title=Guide_to_Nano-RISC&amp;diff=36935&amp;oldid=prev"/>
		<updated>2023-10-22T09:48:33Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «{{Заготовка}}  = Nano-RISC =  Nano-RISC - архитектура процессора, используемая в интегральных платах....»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Заготовка}}&lt;br /&gt;
&lt;br /&gt;
= Nano-RISC =&lt;br /&gt;
&lt;br /&gt;
Nano-RISC - архитектура процессора, используемая в интегральных платах.&lt;br /&gt;
&lt;br /&gt;
Процессоры на этой архитектуре в среднем имеют:&lt;br /&gt;
* 16 регистров общего назначения '''R'''.&lt;br /&gt;
* Регистр счётчика инструкции '''PC'''.&lt;br /&gt;
* Регистр указателя на стек '''SP'''.&lt;br /&gt;
* 8 пинов внешних устройств '''D'''.&lt;br /&gt;
* 512 байт стека.&lt;br /&gt;
* 16384 байт оперативной памяти&lt;br /&gt;
&lt;br /&gt;
Существует [https://igorsaux.github.io/nano-risc/ Web-IDE], в которой эмулируется работа процессора, можно писать и компилировать код, а также построчно наблюдать за его работой.&lt;br /&gt;
&lt;br /&gt;
= Ассемблер =&lt;br /&gt;
&lt;br /&gt;
Язык ассемблера довольно прост - каждая строчка может начинаться с комментария, инструкции или метки.&lt;br /&gt;
&lt;br /&gt;
Пример комментария:&lt;br /&gt;
 # Здесь можно написать любой текст, он будет убран из программы&lt;br /&gt;
&lt;br /&gt;
Пример инструкции:&lt;br /&gt;
 mov $r0 10&lt;br /&gt;
&lt;br /&gt;
Пример метки:&lt;br /&gt;
 loop:&lt;br /&gt;
&lt;br /&gt;
Пример рабочей программы:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;dbgs &amp;quot;Factorial of 5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# N&lt;br /&gt;
mov $r0 5&lt;br /&gt;
&lt;br /&gt;
# Result&lt;br /&gt;
mov $r1 1&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
	# If $r0 &amp;lt;= 1 then jump to 'end'&lt;br /&gt;
	ble $r0 1 end&lt;br /&gt;
&lt;br /&gt;
	# $r1 = $r1 * $r0&lt;br /&gt;
	mul $r1 $r1 $r0&lt;br /&gt;
&lt;br /&gt;
	# $r0 = $r0 - 1&lt;br /&gt;
	sub $r0 $r0 1&lt;br /&gt;
&lt;br /&gt;
	# Jump back to 'loop'&lt;br /&gt;
	jmp loop&lt;br /&gt;
&lt;br /&gt;
end:&lt;br /&gt;
	dbgs &amp;quot;Result:&amp;quot;&lt;br /&gt;
	dbg $r1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Инструкция ==&lt;br /&gt;
&lt;br /&gt;
Любая инструкция состоит из одной операции и от нуля до нескольких аргументов, в зависимости от операции может требоваться разное количество аргументов.&lt;br /&gt;
&lt;br /&gt;
Аргумент представляет из себя либо число, либо регистр, ничего другого операция принимать не может, но язык ассемблера позволяет указывать строчки и метки, превращая их в числа во время компиляции.&lt;br /&gt;
&lt;br /&gt;
== Метка ==&lt;br /&gt;
&lt;br /&gt;
Метка - некая именная точка в коде, при компиляции метки превращаются в номера инструкции.&lt;br /&gt;
&lt;br /&gt;
Некоторые операции могут заставлять процессор переходить к инструкциям, находящимся в другой части программы, - для этого необходимо изменить регистр счётчика инструкции на номер инструкции относительно начала программы (в счёт идут только строчки с инструкциями). Во время написания программы или дальнейших изменениях номера инструкции могут меняться, для этого и существуют метки - они автоматически рассчитают своё положение во время компиляции, избавляя программиста от ручного подсчёта при каждом изменении.&lt;br /&gt;
&lt;br /&gt;
== Комментарии ==&lt;br /&gt;
&lt;br /&gt;
Комментарии никак не влияют на код, их можно использовать для пояснения кода и т.д.&lt;br /&gt;
&lt;br /&gt;
== Строки ==&lt;br /&gt;
&lt;br /&gt;
Строки - особый вид аргумента, во время компиляции они помещаются в отдельную секцию программы, которая затем загружается в оперативную память сразу после кода программы. На место строчки подставляется адрес начала строки в памяти, конец строки обозначается нулевым байтом.&lt;br /&gt;
&lt;br /&gt;
= Регистры =&lt;br /&gt;
&lt;br /&gt;
Каждый процессор имеет 32-х битные регистры общего назначения, в коде обозначаются как '''rN''', где N - индекс регистра (начиная с 0). Они могут хранить в себе как вещественное так и целое число.&lt;br /&gt;
&lt;br /&gt;
Обращаться к регистрам в коде можно двумя способами (где x - название регистра):&lt;br /&gt;
* Прямой доступ - '''$xN''', при таком обращении из регистра берётся содержащееся в нём число.&lt;br /&gt;
* Косвенный доступ - '''%xN''', в этом случае из регистра берётся число, которое используется как индекс другого регистра, из которого уже будет взято итоговое число.&lt;br /&gt;
&lt;br /&gt;
'''Косвенный доступ доступен только регистрам общего назначения!'''&lt;br /&gt;
&lt;br /&gt;
Существует регистр счётчика инструкции - в коде обозначается как '''pc''', он указывает на следующую инструкцию, при её изменении можно изменять порядок выполнения инструкции.&lt;br /&gt;
&lt;br /&gt;
Регистр указателя на стэк - '''sp''', указывает на свободную ячейку в памяти. Важным отличием от других регистров является то - что его нельзя изменять напрямую, только специальными операциями - '''push''' и '''pop'''!&lt;br /&gt;
&lt;br /&gt;
= Операции =&lt;br /&gt;
&lt;br /&gt;
Существует несколько десятков различных операции, запоминание порядка аргументов может показаться сложным - но в основном действуют такие правила:&lt;br /&gt;
&lt;br /&gt;
* С тремя аргументами: '''c = a X b''' - производится некоторая операция '''X''' над значениями '''a''' и '''b''', результат записывается в '''c'''. Примеры:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# $r0 = 2 + 4&lt;br /&gt;
add $r0 2 4&lt;br /&gt;
&lt;br /&gt;
# $r1 = 5 * 10&lt;br /&gt;
mul $r1 5 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* С двумя аргументами: '''c = f(a)''' - выполняется некоторое преобразование '''f''' над значением '''a''', результат записывается в '''c'''. Примеры:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
# Преобразования нет, просто сокращённая запись &amp;quot;add $r0 $r0 0&amp;quot;&lt;br /&gt;
# $r0 = 5&lt;br /&gt;
mov $r0 5&lt;br /&gt;
&lt;br /&gt;
# $r1 = sqrt(5)&lt;br /&gt;
sqrt $r1 5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Список операции ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Математические операции&lt;br /&gt;
|-&lt;br /&gt;
! Обозначение !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| '''add''' ''c'' ''a'' ''b'' || Сложение: ''a'' + ''b''.&lt;br /&gt;
|-&lt;br /&gt;
| '''sub''' ''c'' ''a'' ''b'' || Вычитание: ''a'' - b''.&lt;br /&gt;
|-&lt;br /&gt;
| '''mul''' ''c'' ''a'' ''b'' || Умножение: ''a'' * ''b''.&lt;br /&gt;
|-&lt;br /&gt;
| '''div''' ''c'' ''a'' ''b'' || Деление: ''a'' / ''b''.&lt;br /&gt;
|-&lt;br /&gt;
| '''mod''' ''c'' ''a'' ''b'' || Деление с остатком: ''a'' % ''b''.&lt;br /&gt;
|-&lt;br /&gt;
| '''sqrt''' ''c'' ''a'' || Квадратный корень.&lt;br /&gt;
|-&lt;br /&gt;
| '''trunc''' ''c'' ''a'' || Отбрасывание части после запятой.&lt;br /&gt;
|-&lt;br /&gt;
| '''ceil''' ''c'' ''a'' || Округление вверх.&lt;br /&gt;
|-&lt;br /&gt;
| '''floor''' ''c'' ''a'' || Округление вниз.&lt;br /&gt;
|-&lt;br /&gt;
| '''abs''' ''c'' ''a'' || Получение модуля числа.&lt;br /&gt;
|-&lt;br /&gt;
| '''exp''' ''c'' ''a'' || Получение экспоненты.&lt;br /&gt;
|-&lt;br /&gt;
| '''log''' ''c'' ''a'' ''b'' || Логарифм: log''b''(''a'')&lt;br /&gt;
|-&lt;br /&gt;
| '''max''' ''c'' ''a'' ''b'' || Записывает в ''c'' максимальное значение из ''a'' и ''b''.&lt;br /&gt;
|-&lt;br /&gt;
| '''min''' ''c'' a ''b'' || Записывает в ''c'' минимальное значение из ''a'' и ''b''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Логические операции&lt;br /&gt;
|-&lt;br /&gt;
! Обозначение !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| '''and''' ''c'' ''a'' ''b'' || Записывает в ''c'' 1 если ''a'' и ''b'' имеют ненулевое значение.&lt;br /&gt;
|-&lt;br /&gt;
| '''or''' ''c'' ''a'' ''b'' || Записывает в ''c'' 1 если ''a'' или ''b'' имеет ненулевое значение.&lt;br /&gt;
|-&lt;br /&gt;
| '''xor''' ''c'' ''a'' ''b'' || Записывает в ''c'' 1 если один из аргументов имеет ненулевое значение, а другой нулевое.&lt;br /&gt;
|-&lt;br /&gt;
| '''nor''' ''c'' ''a'' ''b'' || Записывает в ''c'' 1 если оба аргумента имеют нулевое значение.&lt;br /&gt;
|-&lt;br /&gt;
| '''inf''' ''c'' ''a'' || Записывает в ''c'' 1 если ''a'' - бесконечность.&lt;br /&gt;
|-&lt;br /&gt;
| '''nan''' ''c'' ''a'' || Записывает в ''c'' 1 если ''a'' - не число.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Битовые операции&lt;br /&gt;
|-&lt;br /&gt;
! Обозначение !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| '''andi''' ''c'' ''a'' ''b'' || Битовое И.&lt;br /&gt;
|-&lt;br /&gt;
| '''ori''' ''c'' ''a'' ''b'' || Битовое ИЛИ.&lt;br /&gt;
|-&lt;br /&gt;
| '''xori''' ''c'' ''a'' ''b'' || Битовое исключающее ИЛИ.&lt;br /&gt;
|-&lt;br /&gt;
| '''shr''' ''c'' ''a'' ''b'' || Сдвиг ''a'' на ''b'' вправо (''a'' &amp;gt;&amp;gt; ''b'').&lt;br /&gt;
|-&lt;br /&gt;
| '''shl''' ''c'' ''a'' ''b'' || Сдвиг ''a'' на ''b'' влево (''a'' &amp;lt;&amp;lt; ''b'').&lt;br /&gt;
|-&lt;br /&gt;
| '''ror''' ''c'' ''a'' ''b'' || Круговой сдвиг ''a'' на ''b'' вправо.&lt;br /&gt;
|-&lt;br /&gt;
| '''rol''' ''c'' ''a'' ''b'' || Круговой сдвиг ''a'' на ''b'' влево.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Операции с памятью&lt;br /&gt;
|-&lt;br /&gt;
! Обозначение !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| '''lb''' ''c'' ''a'' || Чтение байта из адреса ''a'' в ''c''.&lt;br /&gt;
|-&lt;br /&gt;
| '''lh''' ''c'' ''a'' || Чтение двух байтов из адреса ''a'' в ''c''.&lt;br /&gt;
|-&lt;br /&gt;
| '''lw''' ''c'' ''a'' || Чтение четырёх байтов из адреса ''a'' в ''c''.&lt;br /&gt;
|-&lt;br /&gt;
| '''sb''' ''c'' ''a'' || Запись байта из ''a'' в адрес ''c''.&lt;br /&gt;
|-&lt;br /&gt;
| '''sh''' ''c'' ''a'' || Запись двух байтов из ''a'' в адрес ''c''.&lt;br /&gt;
|-&lt;br /&gt;
| '''sw''' ''c'' ''a'' || Запись четырёх байтов из ''a'' в адрес ''c''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Операции со стэком&lt;br /&gt;
|-&lt;br /&gt;
! Обозначение !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| '''push''' ''a'' || Записывает в стэк ''a'' и увеличивает счётчик стэка.&lt;br /&gt;
|-&lt;br /&gt;
| '''pop''' ''c'' || Записывает в ''c'' значение из стэка и уменьшает счётчик стэка.&lt;br /&gt;
|-&lt;br /&gt;
| '''peek''' ''c'' || Записывает в ''c'' значение из стэка но не уменьшает счётчик стэка.&lt;br /&gt;
|-&lt;br /&gt;
| '''call''' ''a'' || Записывает текущее значение счётчика инструкции в стек и перемещает выполнение программы на указанное значение.&lt;br /&gt;
|-&lt;br /&gt;
| '''ret''' || Считывает значение из стека как номер инструкции и перемещает выполнение программы на него.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Igorsaux</name></author>
	</entry>
</feed>