Чому інструкцію з копіювання зазвичай називають MOV?


23

У досить багатьох асемблерів інструкція з копіювання значень зазвичай називається "MOV", а її опис у посібниках зазвичай також містить "переміщення" (однак, можна використовувати й інші слова, наприклад "завантажувати", "зберігати", "витягувати" тощо. ) Нечасто знайти ISA ), який не дотримується цієї конвенції.

З іншого боку, в інших контекстах "переміщення" відрізняється від "копіювання" в тому сенсі, що джерело знищене (наприклад, "mv" vs. "cp" в Unix, Move [F6] в Norton Commander і клони тощо). ) "Хід" Асемблера дійсно має семантичну "копію", зберігаючи значення джерела неушкодженим.

Я виявив, що це почалося щонайменше з IBM 1401 (1959), але IBM 360 використовував це слово лише для копіювання на зберігання, але не для операцій між регістрами та сховищами (які використовували "load" та "store") . Але чому він все ще широко використовується і не замінюється на "копію" чи "магазин"?


5
У Вікіпедії сказано : "Переміщення слів для цієї операції є, власне кажучи, неправильним явищем: це мало стосується фізичної концепції переміщення об'єкта від A до B, при цьому місце A стає порожнім; MOV замість цього робить копію стан об'єкта на A і перезаписує старий стан B у цьому процесі. Це відображається в деяких інших мовах складання, використовуючи такі слова, як завантаження , зберігання або копіювання замість переміщення. "
Uwe Keim

@UweKeim Хм, я шукаю пояснення перед тим, як поставити питання, але не поширювався цією статтею. У будь-якому випадку це пояснює поточний стан, але не дає поняття про реальне походження ...
Netch

2
@gnat Я мав на увазі "Архітектуру набору інструкцій", а не шину ISA. Я це переосмислив.
Netch

@Netch дякую! Мені якось вдалося пропустити це у великому списку розбіжностей у Вікіпедії
гнат

1
Я сумніваюся, що є якийсь спосіб дізнатися, чому спочатку його називали «рухатись», а не «копіювати», але спекулювати - це цікаво. На сторінці вікіпедії для мови складання описується MOV як операція з "переміщення копії даних", що є цікавим тлумаченням. Інша можливість полягає в тому, що з точки зору фактичного використання MOV, операція концептуально є рухом даних; що ми вже не дбаємо про джерело.
Бен Лі

Відповіді:


10

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

Я не маю уявлення про набори інструкцій для міні-комп'ютерів чи мейнфреймів до початку 8080 року, але 8080 використовував "завантажувати" та "зберігати" для більшості інструкцій доступу до пам'яті та "mov" для інструкцій реєстрації до реєстрації, але більшість інструкцій, які могли б працювати на довільному 8-бітовому регістрі також може діяти на "М", яке було місцем пам'яті, адресованим HL, тому "MOV" до або від "M" насправді поводитиметься як завантаження або зберігання.

Щодо різниці між "копіюванням" та "переміщенням", я підозрюю, що це має багато спільного з тим, що код не може ні створювати, ні знищувати регістри; вони просто існують. Описуючи поведінку кодової послідовності mov bx,ax / mov ax,1234, чи має сенс сказати, що перша інструкція копіює bx в ax, а друга інструкція знищує значення в axі замінює його значенням 1234, чи має більше сенсу переглядати першу інструкція як перенесла значення з bx в ax (перетворивши значення в ax на "байдуже"), а друга інструкція завантажує ax (що не хвилювало) 1234? Іноді джерела регістрів все ще мають сенс після інструкції перенесення регістру, але оскільки в наборі інструкцій немає нічого, що вказувало б, чи буде,


У мене немає жодних доказів на підтвердження вашої відповіді, але це, безумовно, звучить правильно. Операції завантаження / зберігання пройдуть інший шлях у процесорі / мікрокодексі через перехід до пам’яті / кешу, але переміщення між регістрами цілком може бути одноцикловим (не потрібно чекати на інших етапах конвеєра), а тому варто диференціюватися. Але це не пояснює переміщення проти копіювання ...
JBRWilkinson

Домовились. Розглянемо, наприклад, пристрої введення зі картами пам'яті. Читання місця розташування джерела може змінити його - наприклад, відкидання елемента, який ви прочитали, з апаратної черги, замінивши його наступним елементом у черзі. Це звучить як крок, а не копія - джерело вже не зберігає цю інформацію, а лише місце призначення. І така поведінка не вирішується процесором, це вирішує цей пристрій з картою пам'яті.
Steve314

У мовах складання використовуються мнемоніка, яка "орієнтована на процесорі". Тобто все названо з точки зору регістрів процесора. Таким чином, "load" зазвичай копіює значення в регістр, тоді як "store" зазвичай копіює одне з регістра в пам'ять. Що тоді викликати копіювання значення з одного регістра в інший? "Переміщення" - очевидний вибір. Якщо таку ж операцію з мікрокодом виконують обидва (як у 68000), "переміщення" є більш загальним вибором для завантаження / зберігання. "Копія" могла бути використана, але може бути зайвою, оскільки насправді немає такого поняття, як справжній "хід", де джерело залишається порожнім.
DocSalvager

@DocSalvage: Якщо 32-розрядний реєстр є фіксованою купою з 32 фліп-флоп або засувок, які завжди будуть існувати, "переміщення" не обов'язково має сенс. Однак в архітектурах з перейменуванням реєстру операнд "переміщення", який також визнає недійсним джерело, може підвищити ефективність, звільнивши віртуальний регістр. Я ніколи не чув, щоб таке робилося, але я не знаю жодної архітектури, яка була розроблена з урахуванням перейменування реєстру.
supercat

@supercat: У комп'ютерному обладнанні всі регістри та всі місця пам'яті містять значення у будь-який час. Насправді немає такого поняття, як "нульовий" або "порожній". Ми використовуємо довільні умови для позначення недійсного вмісту регістра або пам'яті. Дуже часто ми нехай "0" означають "null", але не завжди. Стан "нульового" блоку пам'яті, наприклад, може вказуватися на початкові та кінцеві адреси, збережені в іншому місці. Також є численні інші методи. Зрештою, мнемоніка є довільною, хоча ми намагаємось отримати найбільш широко зрозумілий варіант.
DocSalvager

0

Ви, звичайно, праві. Більшість, якщо не всі екземпляри Mov інструкції насправді є копією.

Деякі фактично навіть не мають Mov, це псевдо інструкція

add dest=source+zero.

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

Скористайтеся випадками: добре в цей час більшість кодів збірки мови генерується компілятором, і команда mov найчастіше використовується для фактичного переміщення значення з одного регістра в інший, щоб джерело регістра (місце пам'яті тощо) можна було повторно використовувати. З міркувань дозволу на виклик цього процесора або через те, що деякі інструкції чи набори інструкцій не є ортогональними, тому вам доведеться переміщувати речі. Звичайно, бувають випадки, коли бажана копія значення і mov може бути використаний для його виготовлення.

Всерйоз сумніваюся, що ми коли-небудь дізнаємось, хто з людей або команда придумав цей термін першим і чому вони обрали перехід копії. Оскільки ми до цього звикли, ми прагнемо повторно використовувати його з кожним новим набором інструкцій. Як уже згадувалося, деякі набори інструкцій використовують інструкції на основі завантаження та зберігання, де один операнд - це регістр, а інший - адреса, і mov для просто регістру, щоб зареєструвати регістри (і). І інші набори інструкцій використовують mov для реєстрації або mem для будь-якого операнда. Хоча ви, звичайно, можете додати копію до будь-якого / багатьох асемблерів з відкритим кодом, отримати тягу від її використання буде складніше. Якщо ви працюєте десь, де у вас є контроль над оригінальним синтаксисом (робота над місцем створення нового процесора), де ви можете продиктувати реєстр, щоб перемістити регістр, називається копія,


-4

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

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

Отже, ми говоримо про гігантський злом коду, і для чого? це не зробить мову більш читаною, тому що, на відміну від мови високого рівня, у вас немає шансів сказати, що робить код складання, не знаючи складання, і якщо ви знаєте, що складання, ви знаєте, що MOVробить.

Величезна вартість з нульовим посиленням легко пояснює, чому інструкцію не перейменовано.


3
як це відповідає на поставлене запитання?
гнат

2
Єдине речення, яке закінчується знаком питання, - "Але чому він все ще широко використовується і не замінюється на" копіювати "чи" зберігати "?".
Ідан Ар'є

2
Це не пояснює, чому інструкція була названа такою для початку безліччю ISA, розроблених з нуля (тобто без зворотних обмежень сумісності) протягом багатьох десятиліть. Крім того, якщо продавець захотів змінити мнемонічний, незважаючи на зворотну сумісність, він міг би надати псевдонім та сприяти його використанню.

1
Що означає "ОП"? І я не бачив справжнього пояснення.
Netch

1
Я оригінальний плакат, і я констатую, що копіювання між осередками пам’яті в S / 360 - це не «трохи інша операція», а лише окремий випадок одного і того ж копіювання. Питання досі не вирішене.
Netch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.