Во многих ассемблерах инструкция копирования значения обычно называется «MOV», и ее описание в руководствах также обычно содержит «перемещение» (однако можно использовать и другие слова, например «загрузить», «сохранить», «извлечь» и т. Д.). ) Редко можно найти ISA ), который не следует этому соглашению.
С другой стороны, в других контекстах «перемещение» отличается от «копирования» в том смысле, что источник уничтожен (например, «mv» против «cp» в Unix, Move [F6] в Norton Commander и клонах и т. Д.). "Move" ассемблера действительно имеет семантическую "копию", сохраняя исходное значение без изменений.
Я обнаружил, что это началось, по крайней мере, с IBM 1401 (1959), но IBM 360 использовала это слово только для копирования в хранилище, но не для операций между регистрами и хранилищем (которые использовали «load» и «store») , Но почему он все еще широко используется и не заменен на «копировать» или «хранить»?
Ответы:
В некоторых наборах команд существуют различные инструкции для загрузки регистра из памяти, сохранения регистра в памяти или передачи данных между регистрами. В то время как некоторый ассемблер форма использовать глагол «нагрузку» на все (например , 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? Иногда исходные регистры все еще имеют смысл после инструкции переноса регистра, но поскольку в наборе команд нет ничего, чтобы указывать, будет ли это,источник
Вы, конечно, правы. Большинство, если не все экземпляры инструкции mov на самом деле являются копией.
Некоторые даже не имеют mov это псевдо-инструкция для
Также поймите, что синтаксис ascii произвольный, машинный код что-то значит и определен и исправлен для этого процессора. В большинстве случаев, если не все время, создатель / поставщик процессора создает синтаксис частично для определения набора команд (машинный код) и частично для определения синтаксиса, который работает с инструментом, который они также создали или заказали для преобразования этого языка ассемблера в машину. код для их процессора. Вы, конечно, можете, например, зайти в ассемблер gnu (который имеет тенденцию делать все по-своему и в любом случае не следовать синтаксису производителей процессоров) и добавить псевдоинструкцию копирования.
Примеры использования: в наши дни большинство кода на ассемблере генерируется компилятором, а команда mov чаще всего используется для фактического перемещения значения из одного регистра в другой, чтобы можно было повторно использовать исходный регистр (область памяти и т. Д.). По причинам соглашения о вызовах для этого процессора или из-за того, что некоторые инструкции или наборы команд не являются ортогональными, поэтому вам нужно что-то изменить. Конечно, бывают случаи, когда требуется копия значения, и mov может использоваться для создания этой копии.
Я серьезно сомневаюсь, что мы когда-нибудь узнаем, какой человек или команда первым придумал этот термин и почему он выбрал копирование. Поскольку мы привыкли к этому, мы склонны повторно использовать его с каждым новым набором инструкций. Как уже упоминалось, некоторые наборы команд используют инструкции загрузки и хранения на основе регистров, где один операнд является регистром, а другой - адресом, и перемещается только для регистра, чтобы зарегистрировать регистр (ы). И другие наборы команд используют mov для регистра или mem для любого операнда. Хотя вы, безусловно, можете добавить копию к любому / многим ассемблерам с открытым исходным кодом, получить контроль над его использованием будет сложнее. Если вы работаете где-то, где у вас есть контроль над исходным синтаксисом (работа для места, создающего новый процессор), где вы можете диктовать регистр для перемещения регистра, это называется копией,
источник
Замена инструкции означает нарушение обратной совместимости. Ассемблер с новым синтаксисом не сможет собрать код, написанный со старым синтаксисом - если только этот код не использует эту инструкцию (и единственное место, где вы увидите неиспользуемый код ассемблера,
MOV
находится в примерах синтаксиса что показывают другие инструкции ...)Компиляторы обычно генерируют ассемблерный код и автоматически передают его ассемблеру, поэтому их также необходимо модифицировать для соответствия новому ассемблеру. Если язык допускает встроенную сборку, старый исходный код, использующий встроенный ассемблер с
MOV
инструкциями, больше не будет работать.Итак, мы говорим о гигантском разрыве кода, и для чего? это не сделает язык более читабельным, потому что в отличие от какого-либо языка высокого уровня, у вас нет шансов рассказать, что делает ассемблерный код, не зная ассемблер, и если вы знаете ассемблер, вы знаете, что
MOV
делает.Огромная стоимость с нулевым усилением легко объясняет, почему инструкция не была переименована.
источник