Comments 17
Объясните, пожалуйста, как запускаются операция сложения?
Автор использует 41 бит: 40 бит на число + 1 грязный бит? Ведь регистр всегда содержит два числа, в любом случае. Даже если его обнулять после очередного сложения, там всё-равно останутся 0 и 0, что должно бесконечно рекурсивно запускать сложение и вызвать stack overflow.
Когда в стеке вычислений два числа, операция запускается.
Автор использует 41 бит: 40 бит на число + 1 грязный бит? Ведь регистр всегда содержит два числа, в любом случае. Даже если его обнулять после очередного сложения, там всё-равно останутся 0 и 0, что должно бесконечно рекурсивно запускать сложение и вызвать stack overflow.
0
Там же схема есть «Plus register example».
На схеме последняя операция plus gpr0 и комментарий: значение 60 из регистра plus перемещается в регистр gpr0, а регистр plus при этом обнуляется.
Думаю, там нет никакого стека, просто стек придумали для облегчения понимания.
Скорее всего, все что кладем в plus, прибавляется к его текущему значению, а когда из plus что-то забираем, то plus обнуляется.
На схеме последняя операция plus gpr0 и комментарий: значение 60 из регистра plus перемещается в регистр gpr0, а регистр plus при этом обнуляется.
Думаю, там нет никакого стека, просто стек придумали для облегчения понимания.
Скорее всего, все что кладем в plus, прибавляется к его текущему значению, а когда из plus что-то забираем, то plus обнуляется.
0
А как он обнуляется? Как различается нулевое и обнулённое значение? Там стоит счётчик записи? Существует область памяти с пометками занятости всех адресов? У каждого числа есть флаг обнуления?
0
Зачем все эти сложности? Ладно, попробую написать псевдокодом, надеюсь будет понятнее.
Представьте, что у регистра plus есть два метода get и set:
Никак. Зачем их различать?
Представьте, что у регистра plus есть два метода get и set:
private uint _plusValue;
public uint Get()
{
uint result = _plusValue;
_plusValue = 0;
return result;
}
public void Set(uint value)
{
_plusValue += value;
}
Как различается нулевое и обнулённое значение?
Никак. Зачем их различать?
0
А зачем регистр обнулять? Обнуляется (устанавливается в исходное положение) автомат сложения. Первая запись в регистр заносит число в стек (адрес 0) и двигает указатель вверх, вторая запись заносит число в стек (адрес 1), двигает указатель вниз и запускает сумматор. Результат в стек (адрес 0) и автомат в исходное положение (обнулить).
Можно вариант с бесконечным суммированием, каждая запись прибавляется к предыдущей, реального стека нет. При первой записи в ячейке памяти с суммой был ноль, а всё, что пишется в регистр, к ней прибавляется. Чтение выдает сумму и сбрасывает ячейку памяти-сумматор в ноль. Так второй раз прочитать сумму нельзя. Но если добавить флаг «было чтение», то можно, сумма обнулится при следующей записи со сбросом флага.
Примечание: чтение и запись в один регистр могут адресоваться к разным адресам памяти. Например запись к реальной ячейке памяти, содержимое которой приплюсуется к сумме, а чтение к ячейке памяти в которой эта сумма хранится.
Можно вариант с бесконечным суммированием, каждая запись прибавляется к предыдущей, реального стека нет. При первой записи в ячейке памяти с суммой был ноль, а всё, что пишется в регистр, к ней прибавляется. Чтение выдает сумму и сбрасывает ячейку памяти-сумматор в ноль. Так второй раз прочитать сумму нельзя. Но если добавить флаг «было чтение», то можно, сумма обнулится при следующей записи со сбросом флага.
Примечание: чтение и запись в один регистр могут адресоваться к разным адресам памяти. Например запись к реальной ячейке памяти, содержимое которой приплюсуется к сумме, а чтение к ячейке памяти в которой эта сумма хранится.
0
а какой пятый флаг? там четыре преведены…
0
Более полезен виртуальный тренажер реально существующих процессоров.
Подобные игры ума я считаю просто вредными. Ни в каком реальном учебном процессе эти знания не пригодятся.
Подобные игры ума я считаю просто вредными. Ни в каком реальном учебном процессе эти знания не пригодятся.
-6
Не подскажите какие есть на данный момент виртуальные тренажеры реально существующих процессоров ???
+1
Для того, чтобы хорошо понимать, как работают реально существующие процессоры, и мочь оценить, чем один из них лучше или хуже другого, надо понимать общие принципы работы. Вот эта штуковина — хороший тренажер для понимания общих принципов
+5
Немного покритикую.
1. Насколько я понял, этот процессор не умеет работать с памятью (RAM).
2. Не понятно, зачем нужен стек на 16 слов, если есть 19 неиспользуемых регистров.
3. За регистрами PLUS, AND, OR, XOR спрятано неплохое такое АЛУ (Арифметико-логическое устройство). И ещё аппаратный генератор случайных чисел. Получается как-то не очень: давайте сделаем АЛУ с четырьмя операциями, но номального доступа к ним не дадим. Тут должна была быть шутка про сложные хирургические операции через не подходящие для этого отверстия.
Критикуя — предлагай!
Давным-давнов далёкой-далёкой галактике на форуме WASM.RU пользователь Black_mirror опубликовал такую тему:
Однокомандный dzen-процессор ;)
1. Насколько я понял, этот процессор не умеет работать с памятью (RAM).
2. Не понятно, зачем нужен стек на 16 слов, если есть 19 неиспользуемых регистров.
3. За регистрами PLUS, AND, OR, XOR спрятано неплохое такое АЛУ (Арифметико-логическое устройство). И ещё аппаратный генератор случайных чисел. Получается как-то не очень: давайте сделаем АЛУ с четырьмя операциями, но номального доступа к ним не дадим. Тут должна была быть шутка про сложные хирургические операции через не подходящие для этого отверстия.
Критикуя — предлагай!
Давным-давно
Однокомандный dzen-процессор ;)
Исходное сообщение
Число регистров - 2^k (k должно быть не менее 3, наверное :) (к ним также относится счётчик команд ip) Архитектура - трехадресная Число команд - одна единственная (условное вычитание) Число флагов - один (f - флаг переполнения) Разрядность машинного слова - 2+3*k Максимально адресуемое число ячеек памяти - 2^(2+3*k) Все обрабатываемые числа считаются положительными, -1=11...1111 - максимальное число Формат команды: тип 00 R1 R2 R3 - csub R1,R2,R3 if f=0 then R1:=R2-R3,f:=R3>R2 else f=0 01 R1 R2 R3 - csub R1,R2,[R3] if f=0 then R1:=R2-[R3],f:=[R3]>R2 else f=0 10 R1 R2 R3 - csub R1,[R2],R3 if f=0 then R1:=[R2]-R3,f:=R3>[R2] else f=0 11 R1 R2 R3 - csub [R1],R2,R3 if f=0 then [R1]:=R2-R3,f:=R3>R2 else f=0 R1,R2,R3 - поля размером k бит, вся команда занимает одну ячейку памяти Основной цикл: Проверить флаг если f=0 1) считать команду из памяти 2) если тип команды 01 или 10 - считать операнд из памяти 3) вычислить разность и установить флаг при переполнении 4) записать результат в приёмник и увеличить счетчик команд если он(ip) не является приёмником данной команды иначе сбросить флаг перейти к началу При включении питания или поступлении сигнала сброса все регистры и флаг переполнения обнуляются, и начинает выполняться команда расположеная по нулевому адресу. Примеры(предполагается что в начале флаг переполнения сброшен) 1) обнуление регистра csub r,r,r; ;r=0 2) загрузка в регистр единицы csub r,r,r ;r=0 csub r,ip,r ;r=$(адрес этой команды) csub r,ip,r ;r=1 3) сложение регистров a и b csub r,r,r ;r=0 csub b,r,b ;b=-b csub r,r,r ;при b>0 эта команда не выполяется csub a,a,b ;a=a-(-b) csub r,r,r ;при -b>a эта команда не выполяется 4) проверка числа на 0 csub z,z,z csub z,z,r csub <- эта команда будет выполнена если r=0 5) загрузка из памяти csub z,z,z csub r,[m],z 6) сохранение в памяти csub z,z,z csub [m],r,z 7) деление числа в регистре a на число в регистре b, с записью частного в регистр d и остатка в регистр a #1 csub z,z,z ;z=0 #2 csub m,ip,z ;m=$ #3 csub m,m,ip ;m=-1 #4 csub z,z,z ;никогда не исполняется #5 csub d,d,d ;d=0 #6 csub l,ip,m ;l=адрес следующей команды ;начало цикла #7 csub d,d,m ;d=d-(-1) не исполняется при первом проходе цикла #8 сsub z,z,z ;исполняется только при первом прохорде #9 csub a,a,b ;a=a-b #10 csub ip,l,z ;ip=l-z, то есть переход в начало цикла если в предыдущей ;команде не произошло переполнение ;далее довычисление остатка #11 csub z,z,b ;z=z-b #12 csub z,z,z ;на результат предыдущей команды не влияет #13 csub a,a,b ;формирование остатка Работа алгоритма: пусть a=7 и b=3 #1 z=0 f=0 #2 m=2 f=0 #3 m=-1 f=1 -1=11...1111 #5 d=0 f=0 #6 l=7 f=1 #8 z=0 f=0 #9 a=4 f=0 #10 ip=7 f=0 #7 d=1 f=1 #9 a=1 f=0 #10 ip=7 f=0 #7 d=2 f=1 частное уже вычислено #9 a=-2 f=1 -2=11...1110 #11 z=-3 f=1 -3=11...1101 #13 a=1 f=0 остаток тоже вычислен
Брюзжание-mode on
Да, были люди в наше время,
Не то, что нынешнее племя:
Богатыри — не вы!
М. Ю. Лермонтов, Бородино
Не то, что нынешнее племя:
Богатыри — не вы!
М. Ю. Лермонтов, Бородино
+3
2. Не понятно, зачем нужен стек на 16 слов, если есть 19 неиспользуемых регистров.
стек, имхо, гораздо удобнее чем разные регистры, когда у вас есть только одна операция mov
… гораздо более интересно зачем там рандом и как он устроен и работает?
а нужен он для изучения принципов работы в образовательных целях
0
В реальном мире существует странный микропроцессор MAXQ2000
(сейчас принадлежит Maxim Integrated). У него тоже всё через пересылки в разные регистры реализовано. Мнемоники они, конечно, назначили привычные, но под ними только move.
Лет 15 назад мы под него toolchain разрабатывали.
(сейчас принадлежит Maxim Integrated). У него тоже всё через пересылки в разные регистры реализовано. Мнемоники они, конечно, назначили привычные, но под ними только move.
Лет 15 назад мы под него toolchain разрабатывали.
+3
Sign up to leave a comment.
Periwinkle: процессор с одной инструкцией