LINUX.ORG.RU

Почему в процессоре нет инструкции пересылки из одной ячейки памяти в другую

 


0

2

Добрый день, решил освежить знания ассемблера и возник вопрос, а почему мы должны все операции делать через регистры, почему просто нельзя из одной ячейки памяти перекинуть в другую значение? что-то вроде mov [OOFF], [00BB]


такие команды есть в модуле DMA, что логично :) точнее DMA и есть эта команда.

процессор же при выполнении пересылки из RAM в RAM должен будет где-то хранить значение пересылаемого значения, и как следствие твоя команда разваливается на две команды: пересылки из RAM в регистр и пересылки из регистра в RAM. т.е. представляет собой синтаксический сахар, а нахрена он в аппаратном железе ??

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)

Потому что при проектировании х86 системы команд заботились о её эффективности. Пересылка из памяти в память заняла бы дополнительные коды операций и, что ещё хуже, потребовала бы от процессора уметь расшифровывать ещё один шаблон инструкции, и непросто ещё один, а ещё и с двумя разными сегментными префиксами. Учитывая, что нужны такие инструкции крайне редко, и при этом безо всяких вышеперечисленных проблем легко реализуются парой mem->reg, reg->mem, было принято очевидное решение лишний оверхед не создавать.

firkax ★★★★★
()

Кто тебе такое сказал?

push [0x12345678]
pop [0x87654321]

Вот тебе пересылка из памяти в память без задействования регистров. Вообще, подмножество x86 без регистров полно по Тьюрингу, и ты можешь какой угодно код из него лепить.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Ну регистр esp тут таки задействован, а если вспомнить про eip, то получается вообще нет инструкций, которые не задействуют регистры… кроме пожалуй jmp на себя же

cobold ★★★★★
()
Ответ на: комментарий от kawaii_neko

я даж загуглил.

Комментарий: Команда MOVS на самом деле не является командой процессора. Когда в тексте программы встречается эта команда, компилятор вычисляет размерность ее операндов и на основании вычислений подставляет на ее место одну из реальных команд процессора MOVSB, MOVSW или MOVSD.

shTigrits ★★★
()

Потому что оперативная память умеет выполнять только одну операцию за раз и только по одному адресу (так как шина адреса одна). То есть процессору в любом случае придётся где-то сохранить временное значение и операция займёт не меньше двух тактов. Так почему бы не дать возможность дать этой временной ячейке имя и не позволить выполнить ещё какие-то промежуточные операции при необходимости.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)

Вопрос из серии «есть 2 компьютера соединенные сетевым проводом, как передать файл с одного на другой?». Вопрос простой, решение мегасложное.

untitl3d
()
Последнее исправление: untitl3d (всего исправлений: 1)
Ответ на: комментарий от shTigrits

Команда MOVS на самом деле не является командой процессора

Я написал movs[bwd]. И оно аж два в одном - и пересылка, и инкремент. Другое дело, что mov через регистр эффективнее.

kawaii_neko ★★★★
()
Ответ на: комментарий от KivApple

И это всё не помешало сделать команду INC/DEC для ячейки памяти.

Так почему бы не дать возможность дать этой временной ячейке

Как будто MOV MEM,MEM запрещает другие варианты MOV. Зачем преподносить ущербность набора команд x86 как благо?

mky ★★★★★
()
Ответ на: комментарий от hateyoufeel

Вот тебе пересылка из памяти в память без задействования регистров.

Когда? В 85 году?

Вообще, подмножество x86 без регистров полно по Тьюрингу

Мусорный критерий не имеющий смысла.

и ты можешь какой угодно код из него лепить.

Только ещё нужно переместиться в 85, и то не факт что поможет.

right_security
()
Ответ на: комментарий от KivApple

Потому что оперативная память умеет выполнять только одну операцию за раз

Такт чего? В какой вселенной? И как связано ядро и оперативная память?

(так как шина адреса одна)

Шина это что-то сродни кешмису. Не знаешь как работает что-то - говори шина.

Ядро ничего не знает об оперативной памяти. О любой общей памяти. Оно знает только про свой локальный кэш(на самом деле локальная память - это не кеш, а регистры. Но в любом случая кеш +/- тоже считается).

Ни через какую шину оно не читает. Это просто не работает. Ничего не ждёт. И ничего этому не мешает. Как и никаких тактов нет, очевидно.

right_security
()

Потому как это не имеет смысла. Чем больше инструкций, чем больше мусора в желе - тем хреновей оно масштабируется.

«Знания» ассемблера на уровня «mov» и интел-днища - не имеют смысла. Это карго-культ.

В принципе процессор ни о каких «ячейках» не знает. Никакими колхозными «ячейка» память не перекидывается.

Поэтому копировать какие-то «ячейки» смысла нет - это мусорный код. Да и сколько это «ячейка»? Где она указана? mov [OOFF], [00BB] - сколько скопировать? Были попытки копировать куски памяти, но это тоже мусор. Его здесь упоминали. Не взлетело. Причина выше.

В результате, что нам даёт это «копирование»? Какое преимущество? Никакого. Поэтому и нету.

Я тебе больше скажу - процессор не умеет выполнять практически все х86-инструкции, потому что они мусор. Как и х86. Лучше выполнить больше, но нормальных инструкций. Чем меньше, но мусора.

Причин этого много. Одну из них я назвал. В целом в рамках адекватного дизайна ненужно сувать мусор, если в нём нет смысла. А в подобном нет смысла.

Допустим, почему даже х86 современный, несмотря на поддержку х86 - не исполняет их. Да, никто не будет реализовывать исполнение с мусорными инструкциями. Поэтому проще взять нормальные и запилить сверху транслятор, пусть это будет медленнее.

Но дело не в этом, предположим что мы решили пилить исполнение х86-мусора. Вот у тебя есть «записать в память» и далее это записать используется в 10 разных инструкций. Как тебе управлять этими инструкциями?

  • из 10, а не 1.

  • они все занимают разное время, в произвольном порядке читают это память. Как узнать когда начать выполнять следующие чтение? Никак.

Вот чтобы такого не было - инструкции должны выполнять одно действие, которую можно нормально спланировать, распределить, а далее следить.

right_security
()
Ответ на: комментарий от right_security

Поэтому проще взять нормальные и запилить сверху транслятор, пусть это будет медленнее

Ты наверное не в курсе, но так было всегда. И даже для максимально простых инструкций, типа inc ax.

no-such-file ★★★★★
()
Ответ на: комментарий от mky

Зачем преподносить ущербность набора команд x86 как благо?

Я, если честно, ни с одним чипом не сталкивался где бы такое было возможно. Я что-то очевидное упускаю?

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Вы про команды память-память?

Насчёт чипов не знаю. pdp-11 умели память-память, я это пробовал на её клоне Электроника-60. Процессор чипом был 1801ВМ1 и 1801ВМ2 для ДВК, который тоже клон pdp-11, но работали ли на ДВК подобные команды не знаю.

А ещё пишут, были VAX'ы, которы вобще трёхадресные...

А из живого, вроде бы, ibm system/360 - > system/z такое умеют, но не точно.

mky ★★★★★
()
Ответ на: комментарий от KivApple

К чему это? Ну задолго, дальше что? Там где-то написано иное?

Да и в принципе слив на «задолго» предполагает, что isa с того момента не менялась. Что, очевидно, полнейшая чушь.

right_security
()
Ответ на: комментарий от no-such-file

К чему ты это написал? Написал лишь бы написать?

К тому же про «всегда» это чушь. Именно потому, что это было не всегда и существовал циск. Потому как когда у тебя скалярный мусор примитивный - добавить составную инструкцию куда проще. И это действительно работало. Правда адепты не учли того, что это не масштабируется, а потом пришлось всё переделывать. Как обычно.

right_security
()
Ответ на: комментарий от KivApple

Потому что оперативная память умеет выполнять только одну операцию за раз и только по одному адресу (так как шина адреса одна).

а какже многоканальная память?

Psilocybe ★★★★
()
Ответ на: комментарий от mky

Выше ответил почему. Ущербность набора команда х86 как раз таки и обусловлено нахождением подобного мусора в нём.

Ссылаться на всякие окаменелости так же не имеет смысла. А так же ненужно путать mov со всякими операциями фонового копирования/прочего. Другое дело, что в суперскаляре сложно подобно сделать. Непонятно как отслеживать всё это. Ну и неоднородная модель памяти не добавляет понятности.

Блокировать поток вычислений на время? Ну дак там вся лапша встанет раком от этого - толку нет никакого. Уж не говоря о том, что рядовая лапша работает слишком локально, чтобы было подобное эффективно.

right_security
()
Ответ на: комментарий от right_security

Именно потому, что это было не всегда и существовал циск

Дядя ты дурак? Циск это и есть трансляция любой команды в микрокоманды. Ты реально не в теме, а петушишься.

no-such-file ★★★★★
()
Ответ на: комментарий от mky

но работали ли на ДВК подобные команды не знаю.

Куда бы они делись. Весь DECовский набор команд на серии 180x работает, плюс в последних версиях типа 1806 добавлены пара своих. (Тут ещё надо учитывать, что в этих системах регистры внешних устройств мапятся в общее адресное пространство, так что у MOV задач больше.)

А «из живого» техасовские MSP430 точно умеют, у них система команд основана на DECовской, но расширена. Может, и более новые техасовские серии тоже.

alegz ★★★★
()
Последнее исправление: alegz (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Дядя ты дурак? Циск это и есть трансляция любой команды в микрокоманды.

Нёс херню, слился, ушёл в отрицание. Типичная история. Я даже не буду спрашивать о том «зачем?» - начни для начала с пруфов.

right_security
()
Ответ на: комментарий от right_security

начни для начала с пруфов

Пруфов чего? Что cisc инструкции транслируются в микрокоманды? Так это определение cisc, дурачина. Ну иди в википедии почитай, или журнал «Мурзилка».

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Пруфов чего? Что cisc инструкции транслируются в микрокоманды? Так это определение cisc, дурачина. Ну иди в википедии почитай, или журнал «Мурзилка».

Нет, мне ненужны сливы на википедию. Особенно без цитат. Тебе нужно это доказать. Ты можешь это сделать через объяснения - зачем. Зачем делать циск.

Я бы посмотрел на твои жалкие попытки копипасты, типы там уменьшения объёма программы. Ты бы так же слился, но хотя бы интересно. А так ты не просто спрятался за википедию - ты даже цитат не дал.

А для того, чтобы тебе это доказать в целом - тебе нужно доказать, что первый существующий циск раскладывал что-то на микрокоманды(опять можно через зачем, если сольёшься на то что пруфов у тебя нет).

Критерий тебе дали -действуй.

right_security
()
Ответ на: комментарий от no-such-file

Кстати, даже с википедией он засыпался. Судя по всему просто нёс херню, где-то услышав про трансялцию. После начал ссылаться на википедию, но даже цитату не привёл. Потому что слишком позорно её приводить. А я приведу:

A complex instruction set computer (CISC /ˈsɪsk/) is a computer architecture in which single instructions can execute several low-level operations (such as a load from memory, an arithmetic operation, and a memory store) or are capable of multi-step operations or addressing modes within single instructions. The term was retroactively coined in contrast to reduced instruction set computer (RISC)[1] and has therefore become something of an umbrella term for everything that is not RISC, where the typical differentiating characteristic is that most RISC designs use uniform instruction length for almost all instructions, and employ strictly separate load and store instructions.

Никакие микрокоманд тут нет. Операции это не команды. Там даже далее написано что циск в принципе является базой и не имеет собственного определения, а определяется через не-риск.

Именно поэтому здесь и используются риск-понятия про операции(и в целом это даже не операции, но даже если он пытается на это слиться).

Т.е как «экскаватор может за одну «копку» выкопать несколько «копок» Васи» - это не значит, что экскаватор внутри себя где-то Васями копает и его «копками».

Но невежество оно такое. Неси херню, сливайся на википедию.

right_security
()

такая команда довольно редкая и тратить под ее лишний код инструкции - нехорошо.

такая команда в регистровых архитектурах есть пара команд «загрузить в регистр», «выгрузить в память».

такая команда если и нужна, то для пересылки блоков больших размеров - команды или автоинкрементом адреса или «movs»

для совсем эффективной пересылки блоков больших размеров делается контроллер прямого доступа к памяти(ПДП) - он работает отдельно от проца. Проц, или некто еще(контроллер внешнего устройства например), программирует контроллер ПДП на операцию и запускает ее, пока операция выполняется, проц или некто еще, занимается своими делами.

короче - это добавляет лишнюю инструкцию к итак ограниченному множеству кодов инструкций, это можно сделать уже имеющимися командами, это не самое эффективное решение частного вопроса.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)

Ой вей, скоро и такое будет. Какие то дибилы «вычисления в памяти» придумали, а то DDR7-DDR8 продавать трудно. Натурально, предлагают процы в плашки памяти размещать. Тогда такие инструкции будут возможны

DumLemming ★★
()
Ответ на: комментарий от DumLemming

Какие то дибилы «вычисления в памяти» придумали

Вообще, насколько я помню, были (есть?) такие микроконтроллеры, где нет регистров, только память. Соответственно там все команды это «вычисления в памяти».

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Соответственно там все команды это «вычисления в памяти».

вычисления делаются в ALU - достаточно сложном устройстве что занимается как минимум сложением и сравнением с переносом битов, выставлении признаков, типа - нуля, знака, переполнения и так далее.

это ALU подсоединяется по внутренним шинам к регистрам и потому может это делать с внутренними регистрами. но сделать с памятью алу этого не может. из памяти можно только прочитать слово и положить слово.

если сложные операции с памятью таки есть, скорее всего это скрытая выборка из памяти в скрытые регистры, операции там, и выгрузка в память.

также есть «отображение регистров на память», но это просто регистрам присваиваются несуществующие адреса памяти, для как бы работы с регистром «через адрес», но все равно это чисто работа с регистром.

alysnix ★★★
()
Ответ на: комментарий от da17

Я совсем не разбираюсь в схемотехнике, это действительно так сложно/дорого сделать еще одну инструкцию?

набор инструкций ограничен(для других может не остаться кодов). и потребуется не одна инструкция, а несколько, для разных размеров операндов, и будет она все равно транслироваться внутри в пару читать в регистр, писать из регистра.

опять же команда эта редкая. не такой уж непременной необходимости.

alysnix ★★★
()
Ответ на: комментарий от da17

«еще одну» несложно. еще с несколько тыщ транзисторов в в проц и ок.
главное чтобы это имело смысл.

перегонять пару байтиков из памяти в память нужно редко, а гонять нужно большими объемами и т.д.
эффективнее сразу поставить DMA-подмодуль и гонять любыми объемами как из памяти в память, так и в порты, и в прочие модули…..

вот тут все становится все очень эффективно и потому DMA есть и очень сложный.

pfg ★★★★★
()
Ответ на: комментарий от DumLemming

Правильно всё делают, нужно больше мощных специализированных процессоров на общей шине. Скорее всего это в CXL появится, уже с DDR5.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)

почему просто нельзя из одной ячейки памяти перекинуть в другую значение?

Потому что в этом мире всё через задницу. Наверное из-за короткой человеческой жизни, только научился, поднял опыта, а уже помирать пора.

foror ★★★★★
()
Ответ на: комментарий от pfg

т.е. представляет собой синтаксический сахар, а нахрена он в аппаратном железе ??

В принципе современный x86 уже давно весь таким сахаром является, просто видимо смысла большого нет.

praseodim ★★★★★
()
Ответ на: комментарий от kawaii_neko

Оно же софтварное полностью и прокручивается по-адресно тем же CPU. По сути как функция в сишечке. Тесты же были, там где простые инструкции mov'ят гигабайты в секунду, строковые инструкции обрабатывают всего лишь сотни мегабайт в секунду. Почему нельзя было сразу по movs дёргать DMA - вопрос инженерам Интела.

yu-boot ★★★★
()
Ответ на: комментарий от praseodim

ты про трансляцию ч86-команд на риск-процессор ?? :) она появилась чень недавно и вообще
тут другое !!!!!1111
тут если погромисты не идут к железу, то железо идет к погромистам.
проще натянуть еще одну прокладку аппаратной hal, чем пинать погромисткий мир перекомпилить програмки и допилить их под риск-ассемблер.
и даже в будущем погромисты нихера не пойдут по пути улучшения кода, при том что кампеляторы пишут аккурат те же погромисты и нихера не хотят усложнять интеллект оптимизирующих алгоритмов …

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)