Почему инструкция копирования обычно называется MOV?

23

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

С другой стороны, в других контекстах «перемещение» отличается от «копирования» в том смысле, что источник уничтожен (например, «mv» против «cp» в Unix, Move [F6] в Norton Commander и клонах и т. Д.). "Move" ассемблера действительно имеет семантическую "копию", сохраняя исходное значение без изменений.

Я обнаружил, что это началось, по крайней мере, с IBM 1401 (1959), но IBM 360 использовала это слово только для копирования в хранилище, но не для операций между регистрами и хранилищем (которые использовали «load» и «store») , Но почему он все еще широко используется и не заменен на «копировать» или «хранить»?

Netch
источник
5
Википедия говорит : «Слово« переместить »для этой операции, строго говоря, неправильно: оно имеет мало общего с физической концепцией перемещения объекта из А в В, когда место А становится пустым; вместо этого MOV делает копию состояние объекта в точке A и в этом процессе перезаписывает старое состояние B. Это отражается на некоторых других языках ассемблера с использованием таких слов, как загрузка , сохранение или копирование вместо перемещения. ".
Уве Кейм
@ UweKeim Хм, я гуглил для объяснения перед вопросом, но эта статья меня не покормила. В любом случае, это объясняет текущее состояние, но не дает подсказки для реальных источников ...
Netch
2
@gnat Я имел в виду «Архитектура набора инструкций», а не шину ISA. Я пересмотрел это.
Нетч
@ Нет, спасибо! Мне как-то удалось пропустить это в большом списке неоднозначностей в Википедии
Гнат
1
Я сомневаюсь, что есть какой-то способ узнать, почему он изначально назывался «ход», а не «копировать», но спекулировать - это весело. На странице википедии по языку ассемблера он описывает MOV как операцию «перемещения копии данных», что является интересной интерпретацией. Другая возможность состоит в том, что с точки зрения фактического использования MOV, операция концептуально представляет собой перемещение данных; что мы больше не заботимся об источнике.
Бен Ли

Ответы:

10

В некоторых наборах команд существуют различные инструкции для загрузки регистра из памяти, сохранения регистра в памяти или передачи данных между регистрами. В то время как некоторый ассемблер форма использовать глагол «нагрузку» на все (например , Z80 мнемоник Zilog использует ld a,(1234h), ld (1234h),aа ld a,b), а некоторые используют «T» ransfer (например , 6502 с ТХА для «передач X в А»), некоторые используют «шаг» для операций регистрации с регистром, чтобы отличать их от нагрузок и хранилищ. Если у кого-то есть формат команды, такой как 68000, который использует ту же самую общую форму инструкции для регистров в регистр, регистр в память, из памяти в регистр и даже из памяти в память, глагол «двигаться» равен вероятно, лучший глагол общего назначения, чем любая из альтернатив.

Я не имею представления о наборах команд миникомпьютера или мэйнфрейма до 8080 года, но 8080 использовал «load» и «store» для большинства инструкций доступа к памяти и «mov» для команд от регистра к регистру, но большинство команд, которые могли работать произвольный 8-битный регистр также может работать с «M», который является ячейкой памяти, адресуемой HL, так что «MOV» в или из «M» фактически будет вести себя как загрузка или сохранение.

Что касается различия между «копированием» и «перемещением», я подозреваю, что это во многом связано с тем, что код не может ни создавать, ни уничтожать регистры; они просто существуют. При описании поведения кодовой последовательности mov bx,ax / mov ax,1234имеет ли смысл говорить, что первая команда копирует bx в ax, а вторая команда уничтожает значение в axи заменяет его значением 1234, или имеет больше смысла просматривать первую инструкция как переместив значение из bx в ax (что делает значение в ax «пофиг»), а вторая инструкция загружает ax (который был безразличным) с 1234? Иногда исходные регистры все еще имеют смысл после инструкции переноса регистра, но поскольку в наборе команд нет ничего, чтобы указывать, будет ли это,

Supercat
источник
У меня нет никаких доказательств в поддержку вашего ответа, но он, безусловно, звучит правильно. Операции загрузки / сохранения будут проходить по другому пути в ЦП / микрокоде из-за перехода в память / кэш, но перемещение между регистрами может быть однотактным (не нужно ждать на других этапах конвейера) и, следовательно, его стоит дифференцировать. Но это не объясняет ход-против-копирования ...
Дж. Б. Р. Уилкинсон,
Согласовано. Рассмотрим, например, отображаемые в память устройства ввода. Чтение исходного местоположения может изменить его - например, сбросить элемент, который вы прочитали из очереди оборудования, заменив его следующим элементом в очереди. Это звучит скорее как движение, чем как копия - источник больше не содержит эту информацию, а только место назначения. И это поведение не определяется процессором, оно определяется этим устройством с отображенной памятью.
Steve314
Языки ассемблера используют мнемонику, которая "ориентирована на процессор". То есть все названо с точки зрения регистров процессора. Таким образом, «load» обычно копирует значение в регистр, тогда как «store» обычно копирует его из регистра в память. Что тогда называть копированием значения из одного регистра в другой? «Двигаться» - очевидный выбор. Если та же самая операция микрокода выполняет оба (как в 68000), "перемещение" является более общим выбором для загрузки / сохранения. «Копия» могла быть использована, но может быть избыточной, поскольку в действительности не существует такого понятия, как «движение», когда источник оставлен пустым.
DocSalvager
@DocSalvage: если 32-битный регистр представляет собой фиксированный набор из 32 триггеров или защелок, которые всегда будут существовать, «перемещение» не обязательно имеет смысл. Однако в архитектурах с переименованием регистров операнд «move», который также делает недействительным источник, может повысить эффективность за счет освобождения виртуального регистра. Я никогда не слышал о такой вещи, но не знаю архитектур, которые были разработаны с учетом переименования регистров.
суперкат
@supercat: В компьютерном оборудовании все регистры и все области памяти всегда содержат значение. На самом деле нет такой вещи, как «ноль» или «пусто». Мы используем произвольные соглашения, чтобы указать, когда регистр или содержимое памяти недействительны. Очень часто мы позволяем «0» означать «ноль», но не всегда. Например, «нулевое» состояние блока памяти может указываться начальным и конечным адресами, хранящимися в другом месте. Есть также множество других техник. В конечном счете, мнемоника языка является произвольной, хотя мы пытаемся найти наиболее понятный вариант.
DocSalvager
0

Вы, конечно, правы. Большинство, если не все экземпляры инструкции mov на самом деле являются копией.

Некоторые даже не имеют mov это псевдо-инструкция для

add dest=source+zero.

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

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

Я серьезно сомневаюсь, что мы когда-нибудь узнаем, какой человек или команда первым придумал этот термин и почему он выбрал копирование. Поскольку мы привыкли к этому, мы склонны повторно использовать его с каждым новым набором инструкций. Как уже упоминалось, некоторые наборы команд используют инструкции загрузки и хранения на основе регистров, где один операнд является регистром, а другой - адресом, и перемещается только для регистра, чтобы зарегистрировать регистр (ы). И другие наборы команд используют mov для регистра или mem для любого операнда. Хотя вы, безусловно, можете добавить копию к любому / многим ассемблерам с открытым исходным кодом, получить контроль над его использованием будет сложнее. Если вы работаете где-то, где у вас есть контроль над исходным синтаксисом (работа для места, создающего новый процессор), где вы можете диктовать регистр для перемещения регистра, это называется копией,

Старожил
источник
-4

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

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

Итак, мы говорим о гигантском разрыве кода, и для чего? это не сделает язык более читабельным, потому что в отличие от какого-либо языка высокого уровня, у вас нет шансов рассказать, что делает ассемблерный код, не зная ассемблер, и если вы знаете ассемблер, вы знаете, что MOVделает.

Огромная стоимость с нулевым усилением легко объясняет, почему инструкция не была переименована.

Идан Арье
источник
3
как это отвечает на заданный вопрос?
Комнат
2
Единственное предложение, заканчивающееся знаком вопроса: «Но почему оно все еще широко используется и не заменено на« копировать »или« хранить »?».
Идан Арье
2
Это не объясняет, почему инструкция была названа так с самого начала бесчисленными ISA, разработанными с нуля (то есть без ограничений обратной совместимости) в течение многих десятилетий. Кроме того, если поставщик хочет изменить мнемонику, несмотря на обратную совместимость, он может предоставить псевдоним и способствовать его использованию.
1
Что означает «OP»? И я не видел реального объяснения.
Нетч
1
Я являюсь оригинальным постером, и я должен заявить, что копирование между ячейками памяти в S / 360 - это не «немного другая операция», а лишь частный случай того же копирования. Вопрос так до сих пор не решен.
Нетч