Как стать автором
Обновить

Комментарии 84

а разве в дополнительный код не надо перевести при реализации вычитания? Просто сменить старший бит недостаточно.
A - B = A + !B + 1
где ! - инверсия всех разрядов.
умножение тем более не проблема сделать, хоть сдвигами, хоть Бутом.
А будет умножение - можно сделать деление: a/b = a * 1/b, и искать 1/b либо методом Ньютона, либо разложением в ряд (везде нужно только умножение и сложение)
черт, я теперь задумался как инверсию разрядов сделать :)
Можно обнулить регистр B, и потом использовать регистр A как счётчик тактов и добавлять в регистр B в каждом такте минус единицу в дополнительном коде — то есть код 11111111. Тогда после A тактов в регистре B образуется код -1 * A = -A = A в обратном коде. Но обычно операция выдачи обратного кода уже есть у регистра (странное ограничение задал автор поста, или просто забыл про эту операцию).
>в регистре B образуется код -1 * A = -A = A в обратном коде
Ошибка. В дополнительном конечно.
Перезаписать регистр, пропустив все цифры через элемент mod2.
Боюсь, что тут уже наверняка кто-то сказал об этом.
Конечно же задачи на низкоуровневое программирование - прекрасно (в настоящее время их очень не хватает), я готов был поставить посту плюс.
Однако после прочтения всего материала я понял, что он (материал) подан не полно.
Автор совсем не упомянул очень важный момент - как реализована арифметика в данном кристалле?
И какая она - двоичная, третичная?
То что все кратное 2 и является степенями 2 не есть повод для умолчания этого факта.

Поэтому останусь все-таки нейтрален к данному посту. Хотя задумка хороша.
т.е. реализовать на Ассемблере с ограниченными возможностями?
>>А как поменять между собой значения A и B?
A+=B
B=A-B
A-=B
если я не ошибаюсь,то это и есть swap без 3его регистра
работает только в случае, если выполнение первой инструкции (A+=B) не даст выход за границу... Такчто нужно делать XORом, как написал ниже
*как написал ниже XaocCPS
Поменять можно через три xor:
> A = A xor B
> B = A xor B
> A = B xor A
странно, что это многие не знают (проверяла даже среди бывших преподов, ведших программирование). плюс вам.
ну тогда пусть почитают кулинарную книгу низкоуровневого программирования =)
http://www.hackersdelight.org/
AKA "Алгоритмические трюки для программистов"
Проблема в образовании, раньше в школе на информатике преподавали системы счисления, учили алгоритмизации и т.д., сейчас на все это забили.
Данный алгоритм, нам на информатике давали и много всего другого. А сейчас многие программисты не знают что такое двоичная система счисления и что такое логические операции. Поэтому и идем к тому, что требования к железу постоянно растет.
времена меняются и требования меняются.
Когда компьютеры были безумно дорогими - все просто вынуждены были знать и системы счисления, и асм, и ещё кучу всего. Сейчас железо не стОит почти ничего... а вот время программиста стоит очень дорого. Поэтому и обучают их совсем другим вещам.

компьютеры для людей, а не люди для компьютеров — не надо забывать об этом. Если современные технологии позволяют программистам быстрее и проще решать свои задачи, то это только плюс
В С++ однострочник изящный
x ^= y ^= x ^= y;
но медленный
Вообще, на CISC процессорах, обычно есть команда EX/XCHG, которая меняет оба регистра местами.
распространенное заблуждение, работает всегда (за исключением случаев, когда при переполнении бросается аппаратное исключение).
Если занимались программированием на ассемблере, то смогут.
Вообще дело не в знаниях, а в умении. Если голова есть, то задачи решаемы.
нет,не всегда.Иногда не думаешь о ресурсах и задачу можно решать как захочешь,а в таких условиях надо оптимизировать до максммума.
С головой на плечах все должно получится :)
Тогда почему современные программисты, например, те которые пишут на php, делают такой неоптимизированный код?
Вам кажется что они при этом они решают одинаковые задачи?
Да - они переводят алгоритмы в понятную для исполнения компьютером форму
Только не всегда они их оптимально переводят, ой не всегда
Они не ограничены 128 байтами оперативной памяти, а у заказчика нету времени и средств оплачивать и без того недешевый труд программиста.
Не все php-программисты пишут неоптимизированный код. Я 5 лет писал на асме и в моем php-коде трудно что-то дополнительно оптимизировать :)
Верю, потому что аналогичная фигня, хотя на php не пишу
НЛО прилетело и опубликовало эту надпись здесь
А не ставят они такую задачу, ну например потому что, им столько не платят, чтобы вылизывать код как в "истории одного байта", и потому что заказчик и слышать, как правило, не захочет ни о какой оптимизации, если это увеличит сроки исполнения в два-три-четыре раза, потому что к сожалению - всем надо "здесь и сейчас". Нас к этому приучили собственно сами производители железа, больше, быстрее - гигабайты, гигагерцы, да если бы все программировали уделяя столько времени оптимизации, то для текущих задач может быть и хватило железа времен 486 процессор, но тогда бы Всякие Интелы и Нвидии разорились бы.

Маркетинг, будь он неладен.
Всё это можно обозвать одним словом - "прогресс". Маркетинг тут непричём.
Вы ерунду говорите. Если хорошему девелоперу не платят того, что он заслуживает - то такой девелопер не будет там работать. Соответственно если девелоперу плятят мало - значит он такой девелопер. И вот тут начинаются бока. Я, работая не ервый год в веб девелопменте насмотрелся на таие примеры сполна. Когда одинаковая задача решается двумя разными людьми совершенно по разному в зависимости от их скилов. А что касается сроков - так нужно сразу писать хорошо. А что бы писать хорошо, то нужно хорошо проектировать. Есть конечно ньюансы, которые всплавают, но в любом случае - если у человека скилов много, то они никогда не напишет так, что бы это было хреново.
Самое забавное, это то, что наверно 90% программистов на земле постоянно переписывают одно и то же с небольшими вариантами...
Что самое интересное, они сами себя обманывают, считая, что это никому не нужно... Грустно, господа.
>Старший байт будет
поправь: бит
Обычно кроме сложения у регистров есть операция сложения по модулю 2 и выдача обратного кода. В таком случае вычитание реализуется как сказал corristo в первом посте. Для умножения нужно больше, чем два регистра (хотя бы регистр множимого, множителя, накапливающий сумматор и счётчик тактов). Умножение реализуется или "в лоб" — методом накопления частичных остатков, или умножением на несколько цифр множителя (но обычно его реализуют схемным путём — матрица одноразрядных сумматоров). Для деления тоже существует машинный алгоритм, он выдаёт по одной цифре частного за один такт.
Поменять можно через три xor:
A = A xor B
B = A xor B
A = B xor A
если не путаю, по памяти писал
упс, а у нас есть xor? :)
это и есть логическое (побитовое) сложение, или исключающее ИЛИ.
у вас есть стек xDDD
push A
push B
pop A
pop B
помню на васме обсуждали, как все реализовать используя только xor)
и еще — какой минимальный нужен набор инструкций для процессора (тьюринг-полного)

вообще, если такие задачки решать — вам на васм, там сидят гуру вроде касперски и эппла и еще разных людей)
> какой минимальный нужен набор инструкций для процессора (тьюринг-полного)
Одна. http://en.wikipedia.org/wiki/OISC
По-моему, всё от арности зависит )
Можно еще более простую инструкцию использовать. Например, операция булевой алгебры штрих Шеффера (nand) образует полный базис, то есть через нее можно реализовать все остальные двух-операндные булевы функции (такие как and и or), а так же однооперандные (identity, not, 1 и 0), а через них уже можно сделать сложение и дальше пошло-поехало. Вот только программы для такой машины будут воистину низкоуровневыми и очень длинными.
Всё равно нужна инструкция условного перехода. А если мы бьёмся за количество инструкций, то в результате получим фактически nand-and-branch-if-...
То, о чём вы сейчас говорите, не искусство, а мастерство.

Мне по роду деятельности полагается работать с разного рода железом. Это, мягко говоря, очень неприятное занятие. Возможно, люди, которые умудряются впихнуть программу управления звездолётом в 32 байта, мастера высшего класса в своём деле, но, как правило, они сфокусированы на утрамбовке байтов и полировке своего конкретного кода, очень часто забывая о картине в целом. В результате "целая картина" выглядит очень печально.

Искусство — это когда вся система целиком, вместе с 32-мя байтами управления звездолётом работает как слаженный механизм. К сожалению, это бывает редко.

Впрочем, здесь я согласен с автором оригинального текста про один байт — это как два разных мира.
Когда мастер рукопашного боя достигает того, что ребром ладони перебивает камень - это мастерство?
Когда тореодор побеждает быка - это искусство?
Где между ними разница?
Для мастера рукопашного боя разбить рукой камень — мастерство, применить свои знания и умения в бою и победить противника — искусство. Победа торреодора в бою — искусство.

Критерий искусства простой — картина должна быть законченной.
Давайте ещё пониже спустимся попросим схему микропроцессора с АЛУ нарисовать. Нет, это безусловно хорошо, когда человек глубоко понимает электротехнику, дискретную математику, ассемблер и прочие теоретические и низкоуровневые вещи, но не так уж и обязательно. Даже на собеседованиях в Google ниже алогоритмов не спускаются. Сложность технологий сейчас растёт по экспоненте и реалии таковы, поэтому их изучение занимает настолько много времени, что институтские знания вам не сильно помогут, если Вы при работе с Java друг решите тряхнуть стариной и покопаться в сишных исходниках JVM. Любой из современных программистов становится заложником своей предметной области, и если эта область не низкоуровневое программирование - требовать от него этих знаний по меньшей мере глупо.
Каким-то неведомым образом перепутал местами "поэтому" и "что" в предпоследнем предложении)
Да пожалуйста =)
lad.jpg - Picamatic - upload your images
Мы этим больше года занимались, при том что к специальности подобное имеет весьма отдалённое отношение.

Решим задачу для значений до 127. Старший байт будет у нас знаком
Соответственно, выставив старший бит для A, мы получим -A
(-A)+B=A-B
Задача решена

Значения в регистрах хранятся в каком коде? Если в прямом, то написанное выше - бред.
Немного оффтопик, но все же.
Если не секрет в чем сделана схема? Существуют ли нормальные графические симуляторы схем на логических элементах?
OrCad
Proteus VSM
Конкретно эта сделана в LAD (скорее учебная программа). А так есть Proteus, P-Cad и др.
Спасибо за ответы, меня как раз в учебных целях. Сегодня посмотрю.
для учебных есть ещё Electronic WorkBench
настальгия нахлынула :)
знание таких мелочей как раз и скажет о человеке многое, поверьте. то, что сейчас без таких знаний можно обойтись - факт. а вот без таких знаний высокопрофессионален программист - вряд ли. развелось таких Java-программеров, ага:

int c=a;
a=b;
b=a;
a=c;

хех (
1) Вы случаем не расскажете, что должен делать код из вашего поста?

2) При чем тут Java? Вам знакомо понятие самодокументируемого кода, принцип KISS и высказывание Дональда Кнута о преждевременной оптимизации?
Отмазку "о преждевременной эякуляции" часто используют для оправдания говнокода.
Я вот сразу говорю: да мол, написал говно, будет время, обязательно перепишу ;)
Никогда такого не слышал. Зачем оправдываться, если можно просто писать говнокод и никому об этом не говорить? :) А уж зачем писать говнокод, тем более не понимаю :)
Никому не говорить? А у вас нет код-ревью?
Специально его не нужно писать. Но часто нет времени на вылизывание или просто выбран неправильный подход.
Говнокод, он не обязательно выглядит как рыхлый мох. Он может быть вполне красив... на экране, но при этом создавать неявные проблемы и плохо выполнять возложенную на него задачу.
Мне казалось, что вы "говнокодом" называли неоптимизированный, но рабочий код. Проблемы часто возникают и от чрезмерно крутых алгоритмов, которые работают "немного не так".
PS. Код-ревью есть :) И когда находят "говнокод", никто не оправдывается.
Т.е. вы никогда не слышали "я вот это _сейчас_ напишу так, а _потом_ оптимизирую/поправлю/допишу"?
Хорошо если это "потом" наступает.
Ну да, как-то мне везло, хотя верю, что такое бывает. Такое говорят про заглушки, но их, сами понимаете, в продукте обычно не оставляют :)
>1) Вы случаем не расскажете, что должен делать код из вашего поста?

Я так понимаю, это решение задачи "как поменять между собой два значения". delicious почему-то верит, что такая задача - одна из важнейших задач современного программирования.
Помилуйте, человек в своем посте все верно описал. Я в универе 3 года составлял схемы на логических элементах, прессовали нас логикой на ПЛИС. Решали, подобные вашим, задачки на лабораторных. И вот спустя пару лет дай Бог вспомнить хотя бы треть данного материала, потому как у меня есть свои задачи на работе, свои требования, нужно разбираться порой в больших проектах, дописывать функционал, фиксить баги, изучать нечто новое.
хех, вариант с 3-мя xor-ми это как раз пример как НЕ надо делать. мало того что читаемость кода ухудшается, так еще и шансы компилятора оптимизировать код сводятся к нулю. если на более низких уровнях такого рода извращения еще могут быть в редких случаях оправданы, то в java/.net это уже бред.
>> (-A)+B=A-B
По моему правильней всё таки будет так: (-A)+B=B-A
Вот вам баянчик нарыл в продолжение темы.

ИНТЕРВЬЮ ГЛАЗАМИ ПОСТРАДАВШЕГО
http://blog.gamedeff.com/?p=64
Для подсчёта косинуса и синуса нужно подсчитать сумму ряда.
Для подобного микроконтроллера это тупо и неэффективно.
Есть способы гораздо проще и быстрее в разы.
http://en.wikipedia.org/wiki/CORDIC
быстрее предварительно подсчитанных таблиц еще ничего не придумали:)
CORDIC используют и для генерации таблиц в том числе.
Но в контексте микроконтроллера можно их и заранее просчитать =)
Смотря какая точность нужна.
извините, но после той истории Ваша тема выглядит кущенственно и полностью закатывает в грязь то, о чем писал автор...
"Итак, пусть есть 2 однобайтовых регистра A и B, которые образуют двухбайтный AB, стек, условный переход в длинее +- 127 команд от текущей точки, безусловный - 255. 128 команд в оперативной памяти, 8K банк памяти.
Команды работы с регистрами - битовые сдвиги, сложение
Условный переход может быть если стоит флаг выхода за границу регистра?
Что такое выход за границу? Это если к 200 прибавить 100. Будет выход за границу разрядности байта. Это тот, который 8 бит"

Асилить не смог. Афтар, сходи проспись. Потом прочитай, чо ты написал, и попробуй расставить знаки препинания. Если, конечно, разберешься.
Скажем дружно, на икс нужно. Давайте ищо придумаем способ развести огонь без спичек с помощью палочек?
Например, осветить помещение? Ну да... Яблочков зря морочил себе голову...
эдакий тру дауншифтинг по-программистски. я тут как раз сижу впихиваю содержимое 3-х 250-гигабайтников в 2. как-то не по себе стало.
import Data.Bits
import Data.Int

mulp 0 _ = 0
mulp a 0 = 0
mulp a b = sum [(a::Int) `rotateL` i |i<-[0..(b-1)], (b::Int) `testBit` i]
уупс, i<-[0..7]
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории