|
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
|
|
Арифметические операции над небольшими целыми числами в процессоре SPARC11.09.2016, 14:11. Показов 5418. Ответов 57
Метки нет (Все метки)
Здравствуйте, форумчане!
Есть ли среди вас знатоки архитектуры SPARC? Если да, то просветите меня, пожалуйста, по такому вопросу. Как в процессоре SPARC выполняются простые арифметические действия над целыми числами размера меньшего, чем стандартное машинное слово этого процессора (32 или 64 бит)? Допустим, нам надо выполнить какую-то простую операцию над байтом или 16-битным полусловом. Мне хотелось бы понять, каким набором машинных инструкций эта операция над байтом или полусловом длиной в 16 бит будет воплощена? Особенно мне интересно, как осуществляется контроль за переполнением разрядной сетки в этом случае. В случае архитектуры x86 особых вопросов не возникает - как и в любой другой CISC-архитектуре код операции (поле КОП) в команде один и тот же независимо от размера данных, а собственно размер операндов задаётся специальными битами признаков внутри самой команды. Проблемы контроля переполнения данных в x86 (как, впрочем, и в других CISC-архитектурах) тоже нет. Фиксируется переполнение той разрядной сетки, которая указана в поле длины операндов. Т. е. если длина данных равняется одному байту - в регистре флагов фиксируется выход значения за границы одного байта, если операнды представляют собой 16-битные полуслова - фиксируется выход за пределы 16-битного представления целых чисел, если длина операндов равна 32-битному слову, результат должен помещаться в 32 бита (в противном случае будут установлены соответствующие флаги в регистре флагов). То же самое относится к 64-разрядным целым числам. Хотелось бы понять, как те же самые проблемы (хранения небольших целых чисел размера меньшего длины машинного слова, манипулирования этими маленькими числами, контроля над переполнением данных при арифметических операциях с их участием) решаются в архитектуре SPARC. Для примера можно было бы рассмотреть какое-то простое арифметическое действие (например, сложение или вычитание) над двумя числами размером с байт или 16-битное полуслово и привести элементарную программку, которая его выполняет. Был бы очень благодарен тем, кто мне ответит.
0
|
|
| 11.09.2016, 14:11 | |
|
Ответы с готовыми решениями:
57
Арифметические опреции над целыми числами
Арифметические операции над числами |
|
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
|
||||
| 25.12.2016, 08:07 [ТС] | ||||
Ну а так это или не так, умеет ли процессор определять такие непростые зависимости или нет, если он вдруг сработает по описанному сценарию, будет ли к тому времени, как вычислится адрес перехода, готов код трамплина или нет — фиг его знает. Всё это на уровне моих домыслов, не более того.
0
|
||||
|
|
|||||||||||
| 25.12.2016, 12:12 | |||||||||||
|
Если бы в интеловских процессорах не висел целый паровоз всяких ненужных транзисторов для поддержания совместимости, то процессор был бы намного дешевле. Но, к сожалению, рыночные условия надо брать во внимание, потому как без совместимости сразу же пропадёт большое количество покупателей, что негативно отразится на цене. Т.е. замкнутый круг получается Добавлено через 5 минут Добавлено через 4 минуты
1
|
|||||||||||
|
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
|
|||||||
| 25.12.2016, 18:44 [ТС] | |||||||
|
Вот вся разница между тобой и мной в нашей дискуссии в том, что я смотрю на компьютер и процессор, как на интересную и умную машину. Она не стесняет и не ограничивает моих возможностей, она обладает высокой степенью гибкости, а самоизменяющийся код как раз и являет собой пример именно такой высокой гибкости, и её язык при этом строго соответствует своей спецификации. Т. е. команды можно сочетать друг с другом любым возможным способом, каждая команда выполнит ровно то, что написано в справочнике по системе команд — никаких сюрпризов и побочных эффектов от команды ждать не придётся. Это действительно научно-инженерный подход. Для тебя же процессор и компьютер — это всего лишь инструмент для заработка денег кучкой алчных и вёртких барыг. Есть рынок, есть текущие задачи и стиль программирования, востребованный временем, значит, надо ему всячески угождать, выпуская продукт, соответствующий этим запросам. Выпустить быстрее, больше, слупить поболее бабла за предельно короткий срок. Это гнилой подход на самом деле, ни к какому прогрессу не ведущий. Этим принципом руководствуется Голливуд, выпуская свои идиотские фильмы, им же в ещё большей степени руководствуется российский кинематограф, создавая кино, непригодное к просмотру, наши замечательные соотечественницы-писательницы — Донцова, Устинова, Маринина — или такой же замечательный писатель — Акунин — действуют в том же русле (живут все они, кстати, припеваючи). Этот же подход — "Всё во имя коммерции!" — исповедует и компания Microsoft. При этом нельзя сказать, что рождённая этой фирмой ОС Windows действительно качественная, надёжная и красивая система, скорее, наоборот. Так что не стоит бранить учёных, называя их паразитами, проедающими бюджет, от них, скорее, больше пользы.
Да, мне нравится идея самомодификации кода, я нахожу её плодотворной. А ещё мне нравится оператор goto в ЯВУ, преданный анафеме блюстителями стиля, я уважаю указатели в C. С Лиспом и Хаскеллем поработать не приходилось. И я не вижу никакого резона всё это запрещать. Вообще можно было бы придумать язык, в котором была бы предусмотрена возможность самогенерации кода в процессе выполнения. Для таких случаев годился бы тот же самый подход. Сейчас это способны делать только интерперетаторы. Универсально, но довольно медленно. Интересно, а как там в Лиспе и Хаскеле? Может, там тоже есть встроенный компилятор вроде того, о котором я говорил? И неизвестно, где ещё самомодифицируемый код может пригодиться. Боюсь, мой пример не единственный.
Первое заблуждение. Не облегчит это сколько-нибудь серьёзно процессор. В нём столько всякой разнообразной аппаратуры и по детектированию зависимостей между командами, и по переименованию регистров, и по определению всяких нестандартных ситуаций, когда разрешить конфликт можно только, приостановив на время нижние ступени конвейера, и дождавшись выполнения впереди идущих команд (pipe interlocks). Всякие статистические предсказатели ветвлений (фирма AMD для их предсказания додумалась уже использовать нейронные сети) очень сложно устроены. Кэш тоже сложный с опережающей (интеллектуальной, спекулятивной) загрузкой данных. Так что автоматическое детектирование модификации кода — это далеко не самое сложное, что есть в процессоре. Это капля в море. Выкинуть эту функцию — и процессор упростится не более, чем на 1 - 2%. Ровно на столько же он станет дешевле (а то и меньше). И заплатить вместо 400 долларов, допустим, 392, чтобы получить сильно изуродованную архитектуру — а оно мне надо? Второе заблуждение. Если сохранить возможность самомодификации кода, но не отслеживать её аппаратурой процессора, хакерам, как ты думаешь, это нисколько не усложнит жизнь. Просто между модификацией/генерацией некоторой команды и её исполнением надо будет выждать некоторое количество тактов. Т. е. нельзя будет модифицировать одной командой код другой рядом с ней стоящей команды. Ну так хакер сообразит вставить между модифицирующей и модифицируемой командой N штук nop (штук 20 - 30, больше и не надо). Если и это не поможет (так как nop'ы будут просто пропущены процессором и это не займёт у него ни одного такта), хакер вставит просто кучу бессмысленных арифметических и пересылочных действий — mov, xchg, add, sub, mul, div (последняя выполняется дольше всего), and, or, xor. После того как весь этот мусор выполнится, нужная команда или группа команд будет готова к загрузке в буфер. Так что такой наплевательский подход на устройство процессора усложнит жизнь приличному программисту, но совсем не хакеру.
mov ax, 3 намного сложнее, чем inc ax Я выбрал интелловский ассемблер, но это, скорее, псевдокод. Я так программировать не призываю. Хотя над вашими программёрскими стандартами я смеюсь.
Другой пример. Фирма IBM, разработавшая к началу 70-ых (а может, чуть раньше) своего великого монстра. Назывался монстр IBM System/360, он вообще шёл с операционной системой OS/360 (очень сложной для своего времени) и обширнейшим набором программ. Ассемблер, компиляторы, Фортран, PL/1, Cobol, все необходимые базовые библиотеки, — всё это присутствовало в системе безоговорочно. И полный комплект документации. Третий пример. СССР. ЭВМ БЭСМ-6, середина 60-ых годов. Там тоже была простенькая операционная система, какой-нибудь пакетный исполнитель заданий, обязательно присутствовал транслятор Фортрана или Алгола-60 (или обоих вместе). Наверняка простенькая библиотека ввода-вывода тоже была, иначе как этим всем пользоваться. И разработаны все эти программы были скорее всего тем же самым институтом, который проектировал аппаратуру. Четвёртый пример. ЭВМ МИР. Маленькая вычислительная машинка примерно тех же лет, имевшая небольшие габариты. Тоже весь базовый набор программ имела от производителя, а как же без них. Так что производители железа того времени не просто сотрудничали с создателями программ, а они сами же и создавали эти программы. Это были два подразделения, работавшие в одной фирме (или в одном институте в СССР). А так, выпустить голое железо. Кто бы для него стал базовое ПО писать? Кому бы оно нужно было? В США это всё просто покупать бы не стали, и фирмы-производители это всё прекрасно понимали. Так что представление о том, что производители компьютеров варились тогда в собственном соку и делали вещь в себе, оно абсурдно. Это такая вымышленная реальность у тебя в голове. Сейчас произошло, скорее, разделение труда между производителями процессоров и фирмами, разрабатывающими программы, хотя они и плотно общаются. А про то, что теперь для программиста теперь единицей абстракции является не процессор, а машинный комплекс, и что недостатки процессора можно исправить компилятором, библиотеками, ОС и пр. и пр. — это всё фигня чистой воды. Процессор настолько фундаментальная и важная здесь единица, что его недостатки не выправишь ничем, они будут все вылезать наружу. Если команды будут иметь кучу побочных эффектов при исполнении, связанных с другими рядом стоящими командами, исправить это компилятором будет очень сложно, да и неразумно. Самое страшное будет, что разработчикам компилятора будет очень сложно, почти невозможно, все эти побочные эффекты просчитать. И ошибки нет-нет, да и будут иногда вылезать. Примеры таких побочных эффектов в MIPS и SPARC, не самые страшные, — это слоты задержки ветвления, в ранних MIPS'ах слоты задержки загрузки. Всё это мог учесть компилятор, хотя хорошего в этом было мало. Если же постараться так облегчить и упростить суперскалярник, будет вообще белиберда на выходе. Это ты предлагаешь примерно, как построить дом из гнилых досок и брёвен. Доски и брёвна у него рассыпаются в руках, зато гвозди из отличной нержавейки. И пластиковые окна от лучшего производители, даже система кондиционирования самая лучшая в мире стоит. И потому они выправляют все недостатки дома. Так не бывает
0
|
|||||||
|
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
|
|||
| 25.12.2016, 18:45 [ТС] | |||
Мне почему-то кажется, что Intel всё-таки умеет справляться с этой сложностью, возникающей при самомодификации кода, безупречно. Может, путём потери производительности, может, путём сброса кэша и полной очистки конвейера. И тут никаких проблем и противоречий не возникает, даже если команды стоят совсем рядом. Я просто погуглил сейчас. И никто о существовании такой проблемы, что мол, может не обновиться изменённая команда внутри процессора, не пишет. Возможно, проблемы-то и нет, и зря мы с тобой спорим.
0
|
|||
|
|
|||||||||||||||||||||
| 25.12.2016, 20:48 | |||||||||||||||||||||
Но при изобретении нового языка нужно понимать, что он должен хоть в чём-то иметь преимущество перед "обычными" языкамиДобавлено через 17 минут Добавлено через 6 минут
0
|
|||||||||||||||||||||
|
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
|
||||||
| 26.12.2016, 09:28 [ТС] | ||||||
|
2. Но смею тебя уверить, что любой нормальный процессор (а не сферический процессор в вакууме, придуманный тобой для нашего спора) при всех своих сложных механизмах работы (конвейеры, 4 АЛУ и 2 FPU, 3-уровневый кэш, спекулятивное предсказание переходов и мн. др.) стремится у программиста создать иллюзию нормального ПОСЛЕДОВАТЕЛЬНОГО исполнения. Любой разработчик цифровой электроники или человек, близко связанный с этой отраслью, тебе вне всякого сомнения это подтвердит. И только сумасшедший будет утверждать обратное. И этот принцип (иллюзии последовательного выполнения потока команд так, как они записаны в программе) справедлив и для Intel'а, и для SPARC'а, и для Power'а, и для ARM'а, и для любого другого нормального процессора. Бывают небольшие отклонения от него (тот же delay branch slot, он имеет, скорее, исторические причины), но они легко и однозначно учитываются программистом на ассемблере или разработчиком компилятора. Или будешь опять спорить с этим очевидным утверждением? Добавлено через 1 час 20 минут Далее... Так что в идеале процессор по-прежнему остаётся аппаратом, последовательно исполняющим свои команды, без каких-либо побочных эффектов и трудно учитываемых странностей в поведении. Он полностью соответствует своему каноническому описанию, даваемому в массовых учебниках и в ISA Manual (на важно, справочник это по системе команд Intel, Sparc, Power или Arm). Так что всё, что пишут по этому поводу в книжках (учебниках или официальных руководствах), оно совершенно правильно и это не какой-то там выдуманный компьютер. Ошибки же, перечень которых имеется в errata'х, — это дефекты, подлежащие в дальнейшем исправлению подобно тому, как стараются избавиться от всяких глюков в gcc или каком-либо другом компиляторе. Ты же, напротив, специально для нашего спора стараешься придумать какой-то "грязный" процессор и доказать, что это и есть единственно правильный вариант. Поверь мне, это не так, и ты этому не найдёшь никакого подтверждения. При чём тут растактовка по конвейеру, я вообще не понял. Она нужна для оптимизации программ, но она никак не влияет на конечный результат обработки процессором программ (за исключением случая глюков, багов и дефектов, которые конечно же встречаются). Добавлено через 32 минуты
![]() Добавлено через 2 минуты Далее... Я сам устал от этого спора ![]() Добавлено через 36 минут От учёных же пользы ничуть не меньше, без них коммерческие технологии были бы просто невозможны. Как было возможно создать диод или транзистор без знания о pn-переходе и знания основ квантовой механики? А ведь квантовая механика выходит далеко за пределы электроники, пока она всё равно имеет больше теоретическое, чем практическое применение. Как без знаний химии получить сверхчистый кремний? А ведь без этого всего компьютерные технологии невозможны были бы в принципе. Как без очень глубоких знаний органической химии и биологии развивать фармацевтику? Это просто невозможно. Таких примеров масса. Технологии и производство — следствие и применение научных знаний. Есть, разумеется, и обратная связь, она тоже очень важна. Все успешные и богатые страны — это страны с развитой фундаментальной (в т. ч. отвлечённой и оторванной от практики) наукой. У кого науки нет (или они её забросили), те торгуют кофе, какао, нефтью и газом. По поводу телескопов, бороздящих просторы Вселенной... Трудно сказать, будет от этого практическая польза или нет когда-нибудь, но это уже вопрос культуры и интеллектуального развития людей. Так что всерьёз утверждать, что учёные проедают бюджет и паразитируют на налогоплательщиках, может только глупец. Ну или такое может говорить умный человек с чувством юмора или сарказма.
0
|
||||||
|
|
||
| 26.12.2016, 09:46 | ||
|
(Тут я вспомнил, с чего всё началось) Я не знаю тонкостей работы других процессоров, но очень сомневаюсь в том, что там устроено так же как на интеле (т.е. аппаратура автоматически распознаёт запись в код). Но всё это можно посмотреть в исходниках gcc. У меня под руками оказался gcc-4.8. Арх-зависимые фрагменты находятся в каталоге gcc-4.8.0/gcc/config. Далее в нужном подкаталоге ищешь макрос TARGET_TRAMPOLINE_INIT и растущий от него код. На sparc'е этот код заканчивается вызовом gen_flush, на arm'е вызовом функции __clear_cache, на mips'е - gen_clear_cache. Ради интереса можешь посмотреть на других. Твой изначальный вопрос был о том, можно ли делать самомодификацию кода. Так вот ответ остался прежним - можно, но нужно делать это правильно
1
|
||
|
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
|
|||
| 26.12.2016, 10:56 [ТС] | |||
![]() Вложение функций друг в друга есть в очень многих языках. Есть оно совершенно точно в Паскале. Не уверен точно, но наверняка оно есть и в Аде. Цель этих вложенных процедур и функций очень проста — сделать программы более модульными и структурными, а как следствие, более понятными. Модульность в языке Си (да и в плюсах в общем-то тоже) недоразвита. Поэтому я не понимаю, почему вложенных функций не должно быть в C, раз они есть в Паскале и Аде. Насколько они сочетаются со стилем и эстетикой языка C, вопрос непростой. Но он спорный и очень субъективный. По поводу массивов переменной длины. Эта возможность появилась ещё в стандарте C99, я это знал. А авторы gcc эту возможность расширили, допустив вкладывать такие массивы в структуры (об этом я узнал сейчас от тебя). Кстати, с чего ты взял, что эта конструкция отсутствует в их документации? Она гуглится на 1, 2, 3. Вот http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html Массивы переменной длины сами по себе довольно удобны, они нужны особенно тем, кто программирует численные методы. В противном случае остаётся использовать традиционное решение через malloc(). Ну а если разработчики gcc решили расширить область применения этих массивов и позволили их включать в структуры — почему бы и нет? Если это технически реализовать несложно, если это не входит в противоречие с другими конструкциями языка, я не вижу в том ничего плохого. Ты считаешь это говнокодом — пожалуйста. Только это всё твоё личное мнение, не более того. Добавлено через 39 минут Про то что Java использует этот подход, я конечно же знал, как ещё иначе ускорить работу JVM. По поводу того, что это, как ты пишешь, "НЕ самомодификация кода, это появление нового кода в процессе работы (без его дальнейшей мутации)", это правильно. Но по-моему, два подхода достаточно близки, они лежат где-то рядом. Кстати, проблема двух команд N1-N2 может и тут проявиться точно так же. Допустим, один код внутреннего компилятора сгенерировал другой крошечный код в одну, две или три команды (а кто его знает, теоретически такое возможно), после чего передал управление на этот маленький код. Если код оказался считан процессором раньше, чем он был окончательно сгенерирован, то случится то же противоречие, что и в нашем случае N1-N2. Генерация трамплина для того, чтобы передать указатель на вложенную функцию другой внешней функции, тот же самый случай. Там нет настоящей самомодификации кода, но есть тот же риск.Так что при самогенерации в общем случае возникает та же самая сложность синхронизации кэшей и конвейера, что и при самомодификации.
0
|
|||
|
|
|||
| 26.12.2016, 11:56 | |||
|
Добавлено через 55 секунд Пока ты писал длинный текст, появился пост #47 (мало ли вдруг не заметил) с информацией о том, как получить ответ на изначально интересовавший тебя вопрос
0
|
|||
|
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
|
|
| 26.12.2016, 12:45 [ТС] | |
|
Спор-то у нас чисто демагогическое направление принял. Хорошо это или плохо писать самомодифицирующийся код. Даже на самом деле нет. Спор о другом шёл. Должен ли процессор поддерживать эту возможность или нет на уровне своей аппаратуры. Я утверждал, что да, поскольку это фундаментальное свойство вычислительной машины, ты же успорял, что это хлам, мусор, это всё давно предано анафеме и нужно только хакерам для их антиобщественной деятельности
И после этого каждый из нас доказывал, что он умнее другого. А в общем-то это вопрос стиля, вкуса и взглядов на вычислительную машину. Пользы от таких споров немного. Лучше обсуждать разные архитектуры, сравнивать их особенности, возможности и заложенные в них ограничения.Пост твой видел, спасибо. У меня как раз оказался исходник gcc-6.2.0. Щас смотрю указанный тобой макрос и функции. Лучше расскажи, как ты вычислил, что генератор этого трамплина скрыт в этом файле и под этим макросом. Как ты к этому пришёл?
0
|
|
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
| 27.12.2016, 10:29 | |
|
Почитал и не пойму, о чем вы спорите ?
Существовал когда-то алгоритм как отличить 80286 от 80386. А по глубине конвейера. У первого она была 8 байт, у второго 16. Алгоритм состоял в том, чтобы модифицировать команду впереди текущей и смотреть увидит процессор эту модификацию или нет. Т.е. в понятиях одного из спорщиков эти процессоры самомодификацию кода не поддерживали. Ну и кому это мешало ? Если ты модифицируешь код, который не дальше 16-и байт от текущего, то после модификации сделай jmp $+2 и конвейер сбросится. Во всяком случае именно у этих процессоров он сбросится. Т.е. спор ни о чем. Даже когда проблема была, она никому не мешала. Добавлено через 11 минут P.S. Можно даже сказать парадоксальное. Не поддержка процессором самомодификации кода помогала писать самомодицикацию кода ! Например, некий код хочет положить поверх себя другой код и передать ему управление в некоторую точку. Делаем (на Пнях и далее работать не будет) : rep movsb ret где ret сработает только потому, что она в конвейере, в памяти она уже убита. Ну и ret неизбежно сбросит конвейер и вуаля.
2
|
|
|
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
|
|||||
| 27.12.2016, 11:44 [ТС] | |||||
А почему любой переход, даже безусловный, приводил в этих процессорах к сбросу и полной очистке конвейера? Может, это делалось для того, чтобы избежать всяких побочных эффектов и странностей поведения вроде delay branch slot у ранних RISC (эффект, неизбежный у простенького конвейера, если против него не предпринять специальных мер)?
0
|
|||||
|
|
||||
| 27.12.2016, 14:12 | ||||
|
Не по теме:
P.S. И уж ни в коем случае не надо перевирать чужие слова и приписывать другому человеку то, чего он не говорил Добавлено через 3 минуты Не по теме: Хотя конкретно Ethereal понял, о чём именно шла речь. Либо он реально читал весь этот пустой срач, либо я не прав насчёт того, что конкретно подумает человек со стороны о "самомодификации". Добавлено через 13 минут Добавлено через 20 минут
0
|
||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|||||
| 28.12.2016, 13:20 | |||||
|
Добавлено через 28 минут Появление посредника между памятью и процессором в виде кеша привело к тому, что программно работа конвейера уже не видна. Вроде бы так. Так-что если поддержка самомодификации кода (в том смысле, в какой вкладываешь в это дело ты) и появилась, то только нечаянно, исключительно нечаянно. Добавлено через 9 минут Безусловный переход сбрасывал конвейер именно потому, что байты, расположенные за командой безусловного перехода, исполнять не нужно. Они уже выгреблись и тут вдруг оказалось, что исполнять их не нужно. Значит вон их с конвейера. И заполняем конвейер с нуля по адресу перехода. Предсказание переходов и предвыборка кода по адресу перехода появились только в каком-то из Пней. Добавлено через 15 минут Добавлено через 5 минут Идти на поводу абстракции до конца - это вызовы подпрограмм по наименованию в Algol 60 и трюк Йенсена. Вот уж асбтракция так абстракция. Чистая, абсолютная и черезвычайно сложно реализуемая. Но в конце-концов ведь одумались и отказались от нее.
1
|
|||||
|
|
||
| 28.12.2016, 14:12 | ||
|
0
|
||
|
200 / 87 / 9
Регистрация: 15.11.2010
Сообщений: 472
|
||||||||
| 28.12.2016, 20:18 [ТС] | ||||||||
Смотри, ты говоришь, что абстракция не работает. В качестве примера ты как раз приводишь мой случай самомодификации кода в границах "видимости" конвейера. Да, здесь она не работает, поскольку самомодифицирующийся код — это всё-таки очень редкий приём, больше сейчас относящийся к хакерским трюкам (но оттого, что это "хакерский" приём, не следует, что он не имеет права быть). Поэтому производители современных процессоров не стали заботиться о полной поддержке этого приёма, а без специального учёта он входит в противоречие с принципом конвейера. И вот, на основании того, что этот конкретный случай расходится с теоретическим представлением об идеальном процессоре, ты делаешь вывод, что абстракция не работает, сферы её применения весьма ограничены. Вот, что буквально ты пишешь.
Я, не являясь конечно же профессионалом по части машинного программирования (я на это и не претендую), пока могу назвать лишь несколько примеров такого специфического поведения: 1. delay branch slot у старых RISC-процессоров. Эта особенность связана с принципом работы простого классического конвейера, это неизбежное следствие принципа конвейеризации. С ней можно было искусственно бороться, заставив конвейер сбрасываться после любой команды перехода, условного и безусловного. Почему-то создатели ранних RISC, такие люди как Хеннесси и Паттерсон, пошли по другому пути, видимо они решили, что delay branch slot — дополнительное средство оптимизации быстродействия, позволяющее поднять производительность на 10 - 15 процентов (вместо того чтобы ждать, пока загрузится команда, на которую должно быть передано управление, и терять впустую 1 такт, способствуя образованию в конвейере пустого места, в этот слот можно воткнуть какую-то другую команду из тех, что должны были выполниться до точки ветвления). В более сложных суперскалярных процессорах, как пишут источники, этот оптимизирующих трюк оказался малоэффективен. Слот задержки ветвления легко учитывается и, насколько мне известно, не приводит НИ К КАКИМ неоднозначностям в поведении процессора, хотя и несколько затрудняет чтение и написание программы на ассемблере. Его также без проблем учитывают все компиляторы. 2. Проблема модификации одной командой кода других близлежащих команд, связанная с тем, что близлежащие команды могли уже быть загружены в конвейер (плюс, на это ещё накладывается возможность внеочередного исполнения). То что мы с тобой обсуждали. Да, эта проблема также следует из конвейерной организации процессора, она в случае простого классического конвейера (каких уже почти и не делают) очень похожа на проблему слотов задержки. Если процессор не поддерживает самомодификацию кода на уровне своей электроники, программист или хакер, написавший такой код, должен как-то позаботиться о сбросе кэша или конвейера. В случае SPARC'а, возможно, достаточно команды iflush, в случае старых Интелов было необходимо искусственно вводить команду безусловного перехода, и с ней всё прекрасно работало. В принципе, самомодифицирующийся код — редко использующаяся возможность, поэтому её развитой поддержки в процессоре, похоже, и нет. Но если знать, как ею пользоваться, наверное, реализовать можно. 3. Третий пример нарушения принципа идеального процессора — то что привёл Ethereal. Это команда PUSH SP. Но тут даже на абстрактном идеализированном уровне есть противоречие. Команда и модифицирует значение регистра, и его же записывает по адресу, хранящемуся в этом регистре. В самой формулировке есть противоречие. Значит, каждый процессор может обработать этот случай по-своему. Один поместит в стек SP до модификации, а другой поместит в стек уже модифицированное значение (уменьшенное на 2, 4 или 8). Это примерно как в C следующий код
Но это вообще какой-то достаточно противоречивый случай. Он к случаю последовательного атомарного исполнения процессором команд отношения не имеет, тут совсем другое. Вот я тебе привёл три случая отклонения от модели идеального процессора (мы их все рассматривали). Все их несложно запомнить и учесть при программировании. Ты говоришь, что в RISC-процессорах таких нарушений гораздо больше. Из твоих слов следует, что их вообще огромное количество, они очень тяжело поддаются учёту и чтобы их все знать и учитывать, надо читать не учебники по ассемблеру вроде этого https://www.ozon.ru/context/detail/id/97652/ или этого https://www.amazon.com/Second-... 0120884216, а сложнейшие мануалы на много тысяч страниц, содержащие чуть ли ни растактовку каждой команды по конвейеру. Иначе серьёзной большой и надёжной программы на ассемблере и не написать, ибо модель процессора как последовательного исполнителя команд не состоятельна, между командами в конвейере возникают сложнейшие корреляции, приводящие к неожиданным и непредсказуемым результатам в их поведении и пр. и пр. Я иначе твои слова охарактеризовать, чем бред, не могу. Если это не так, приводи конкретные примеры. Их у тебя должно быть ОЧЕНЬ много. А так, у тебя и учебники по asm'у несостоятельны, и мануалы с растактовкой просто необходимы, без них будут ошибки. В общем, всё как в сумасшедшем доме. Добавлено через 8 минут Вообще наш спор очень тяжёлый, вязкий и к тому же он стал очень малосодержательным. Ты пробуешь загнать меня в угол, а сделать этого не можешь — нечем, доводов у тебя я пока никаких не вижу. Может, его пора и прекратить? Это спор ради спора, пустая потеря времени. Добавлено через 2 минуты P.S. Я вопрос задавал ради того чтобы узнать что-то новое, обогатиться какими-то знаниями, а того, что оно выльется в такую фигню, я даже не предполагал. Добавлено через 8 минут И извини, если был резок в каких-то своих словах. Цели оскорбить у меня не было никакой. Просто это очень тяжело участвовать в таких спорах.
0
|
||||||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|||
| 29.12.2016, 01:59 | |||
|
Команда CPUID появилась только на 80486. Но Дос-оские утилитки типа CheckIt определяли тип процессора и тогда, когда никакой CPUID еще не было. И все эти определения строились исключительно на отличиях реальных процессоров от абстрактных. Соответствуй реальные процессоры абстрактным моделям такое определение было бы совершенно невозможно.
В конце концов алгоритм определения модели процессора из семейства 80x86 устаканился, когда был найден его кратчайший вариант. Надо бы его найти, наверняка в Интернете он где-нибудь есть. Но ранние варианты такого алгоритма были другими и они просто кладезь знаний по ограничениям абстракций, двусмысленностям дефиниций, и остроумия. На память помню что использовались - различия в глубине конвейера и влияние этой глубины на самомодификацию кода - различия в исполнении push SP - многократный сдвиг словного регистра на 16 бит - слово занулится или ни одного сдвига вовсе не произойдет ? То есть число сдвигов берется как оно есть или все же по модулю 16 ? Еще что-то ... вот забыл. Добавлено через 30 минут Очень напоминает шарахания к крайностям времен Перестройки - поскольку имеют место некоторые отклонения от идеала равенства (привелегии партноменклатуры, ага), давайте похерим идеал полностью, как несостоятельный, и другого пути нетЪ. Или таки Нина Андреева, ибо ТРУ ? Одно из двух и иного не дано.
0
|
|||
| 29.12.2016, 01:59 | |
|
Арифметические операции над числами Написать программу калькулятор, выполняющую арифметические действия над целыми и вещественными числами
Длинная арифметика: арифметические операции над числами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
|
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи.
. . .
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|