Перемещение данных из памяти в память на микроконтроллерах - PullRequest
4 голосов
/ 10 сентября 2010

Почему мы не можем переместить данные непосредственно из области памяти в другую область памяти.

Извините, если я задаю тупой вопрос, но я думаю, что это истинная ситуация, по крайней мере для тех, с которыми я столкнулся (8085,8086 n 80386)

Я недействительно ищет решение для перемещения данных (например, для использования movs n all), но на самом деле причина этой аномалии.

Ответы [ 5 ]

5 голосов
/ 10 сентября 2010

А как насчет MOVS ?Он перемещает 8/16/32-битное значение, адресованное esi, в местоположение, адресуемое edi.

4 голосов
/ 10 сентября 2010

Основная причина заключается в том, что большинство наборов команд допускают один операнд регистра и один операнд памяти, и соблюдение этого формата облегчает разработку декодера команд. Это также облегчает работу исполнительного механизма внутри ЦП, потому что инструкция может, как правило, выдавать операцию памяти только одной ячейке памяти, и не более одного блока чтения или записи.

Для непосредственного выполнения инструкции «память в память» необходимо указать две ячейки памяти. Это неудобно, учитывая формат команды регистр / память. Учитывая производительность машин, есть мало оснований для изменения формата инструкции только для этого.

Хак, используемый более современными ЦП, заключается в предоставлении некоторого типа инструкции перемещения блока, в которой местоположения источника и назначения расположены в регистрах (для X86 это ESI и EDI соответственно). Тогда инструкция может просто назначить два регистра (или в случае x86, инструкции, которые просто знают , который регистрирует). Это решает проблему декодирования .

Инструкция выполнение проблема немного сложнее, но у людей много транзисторов. Организовать косвенное чтение из одного регистра, а также косвенное запись через другой, и приращение и того, и другого неудобно в кремнии, но это просто жует некоторые транзисторы. Теперь у вас может быть инструкция, которая перемещается из памяти в память, как вы и просили. На одном из других постеров, отмеченных для X86, есть инструкции (MOVB, MOVW, MOVS, ...), которые делают именно это, один байт памяти / слово / ... за раз.

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

Но если это может сделать один экземпляр, у вас есть проблема в том, что выполнение может занять много времени (как долго перемещать 1 Гб? -> миллионы тактов!), И это разрушает частоту ответа прерывания CPU.

x86 решает эту проблему, позволяя прерывать REP MOV-, при этом ПК возвращается к началу инструкции. Путем надлежащего обновления регистров во время перемещения вы можете прерывать и перезапускать команду REP MOV, имеющую как быстрое перемещение блока, так и высокую скорость отклика на прерывание. Больше транзисторов в трубу.

Ребята из RISC выяснили, что вся эта сложность для инструкции перемещения блока в основном не стоит того Вы можете закодировать тупой цикл (даже x86):

copy: MOV   EAX,[ESI]
      ADD   ESI,4
      MOV   [EDI],EAX
      ADD   EDI,4
      DEC   ECX
      JNE   copy

, который делает то же самое, что и REP MOV-. В значительной степени современные процессоры (x86 и другие) выполняют это так быстро (суперскалярный и т. Д.), Что шина используется так же, как и пользовательская инструкция перемещения, но теперь вам не нужны все эти потерянные транзисторы (или соответствующее тепло).

3 голосов
/ 10 сентября 2010

Большинство разновидностей ЦП не допускают перемещения из памяти в память. Обычно ЦП может одновременно обращаться только к одной ячейке памяти, что означает, что вам нужно временное место для хранения значения при его перемещении (обычно это регистр общего назначения). Если вы подумаете об этом, то для перехода непосредственно из одной области памяти в другую потребуется, чтобы процессор имел доступ к двум разным точкам в ОЗУ одновременно - это означает, по крайней мере, два контроллера полной памяти, и даже в этом случае шансы, что они «сыграют» Ницца "достаточно, чтобы получить доступ к той же оперативной памяти, было бы довольно плохо. Разработчики микросхем, возможно, смогли бы применить некоторые хитрости, чтобы разрешить прямое копирование с одного чипа ОЗУ на другой, но это была бы особая особая функция, которая просто добавила бы стоимость и сложность для решения очень необычной проблемы. *

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

2 голосов
/ 10 сентября 2010

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

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

1 голос
/ 10 сентября 2010

Машины с памятью оказываются медленнее, чем машины с загрузкой. Это было выведено / выяснено / изобретено исследователями RISC в 1980-х или около того. Таким образом, старые архитектуры (VAX / OS360), как правило, имеют архитектуру память-память; новые машины делают загрузку-хранение.

Другой интересный вариант - стековые машины; Кажется, они всегда в меньшинстве.

...