Dlaczego instrukcja kopiowania zwykle nosi nazwę MOV?


23

W dość wielu asemblerach instrukcja kopiowania wartości zwykle nosi nazwę „MOV”, a jej opis w instrukcjach zwykle zawiera także „move” (można jednak użyć innych słów, takich jak „load”, „store”, „extract” itp. ) Znalezienie ISA jest rzadkością ), który nie przestrzega tej konwencji.

Z drugiej strony, w innych kontekstach, „ruch” różni się od „kopii” w tym sensie, że źródło jest zniszczone (na przykład „mv” vs. „cp” w Uniksie, Move [F6] w Norton Commander i klonach itp. ) „Ruch” asemblera naprawdę ma semantyczną „kopię”, dzięki czemu wartość źródłowa pozostaje nienaruszona.

Odkryłem, że zaczęło się to przynajmniej od IBM 1401 (1959), ale IBM 360 użył tego słowa tylko do kopiowania w pamięci, ale nie do operacji między rejestrami i pamięcią (która używała „load” i „store”) . Ale dlaczego nadal jest szeroko stosowany, a nie zastępowany przez „kopiowanie” lub „przechowywanie”?


5
Wikipedia mówi : „Słowo ruch dla tej operacji jest, mówiąc ściśle, mylące: nie ma wiele wspólnego z fizyczną koncepcją przesunięcia obiektu z A do B, a miejsce A staje się puste; MOV zamiast tego tworzy kopię stan obiektu w A i zastępuje w tym procesie stary stan B. Jest to odzwierciedlone w niektórych innych językach asemblera za pomocą słów takich jak ładuj , przechowuj lub kopiuj zamiast przenosić. ".
Uwe Keim,

@UweKeim hmm, szukałem wyjaśnień przed pytaniem, ale nie miałem tego artykułu. W każdym razie wyjaśnia to obecny stan, ale nie daje wskazówek co do prawdziwych początków ...
Netch

2
@gnat Miałem na myśli „Instruction Set Architecture”, a nie autobus ISA. Zmieniłem to.
Netch

@ Pobierz dzięki! Jakoś udało mi się tego nie zauważyć na dużej liście nieporozumień na Wikipedii
komara

1
Wątpię, czy jest jakiś sposób, aby dowiedzieć się, dlaczego pierwotnie nazywano to „ruchem” zamiast „kopiowaniem”, ale spekulowanie jest zabawne. Na stronie wikipedii dotyczącej języka asemblera opisuje MOV jako operację „przenoszenia kopii danych”, co jest interesującą interpretacją. Inną możliwością jest to, że pod względem rzeczywistych zastosowań MOV operacja jest koncepcyjnie ruchem danych; że nie zależy nam już na źródle.
Ben Lee,

Odpowiedzi:


10

W niektórych zestawach instrukcji istnieją odrębne instrukcje ładowania rejestru z pamięci, przechowywania rejestru do pamięci lub przesyłania rzeczy między rejestrami. Choć niektóre formy asemblerowych użyć czasownika „obciążenie” dla wszystkiego (np Z80 mnemoniki Zilog używają ld a,(1234h), ld (1234h),ai ld a,b), a niektóre użytkowania „T” ransfer (np 6502 z TXA dla „transferowego X do A”), niektóre użytkowania „ruch” dla operacji rejestracji w celu rejestracji w celu odróżnienia ich od ładunków i sklepów. Jeśli ktoś ma format instrukcji taki jak 68000, który korzysta z tego samego ogólnego formularza instrukcji dla operacji rejestr-rejestr, rejestr-pamięć, pamięć-rejestr, a nawet pamięć-pamięć, czasownik „move” jest prawdopodobnie lepszy czasownik ogólnego zastosowania niż jakakolwiek alternatywa.

Nie mam pojęcia o zestawach instrukcji minikomputera lub komputera mainframe przed 8080, ale 8080 używał „load” i „store” dla większości instrukcji dostępu do pamięci i „mov” dla instrukcji rejestracji do rejestracji, ale większość instrukcji, które mogłyby działać na dowolnym 8-bitowym rejestrze może również działać na „M”, który był miejscem pamięci adresowanym przez HL, więc „MOV” do lub z „M” faktycznie zachowuje się jak ładunek lub pamięć.

Jeśli chodzi o rozróżnienie między „kopiowaniem” a „przenoszeniem”, podejrzewam, że ma to wiele wspólnego z faktem, że kod nie może tworzyć ani niszczyć rejestrów; po prostu istnieją. Opisując zachowanie sekwencji kodu mov bx,ax / mov ax,1234, czy sensowniej jest powiedzieć, że pierwsza instrukcja kopiuje bx do ax, a druga instrukcja niszczy wartość axi zastępuje ją wartością 1234, czy też sensowniej jest oglądać pierwszą instrukcja przeniosła wartość z bx na ax (czyniąc wartość w ax „nie przejmuj się”), a druga instrukcja ładuje ax (które nie obchodziły) z 1234? Czasami rejestry źródłowe nadal mają znaczenie po instrukcji przeniesienia rejestru, ale ponieważ w zestawie instrukcji nie ma nic, co wskazywałoby, czy tak będzie,


Nie mam żadnych dowodów na poparcie twojej odpowiedzi, ale z pewnością brzmi to dobrze. Operacje ładowania / przechowywania będą podążać inną ścieżką w procesorze / mikrokodzie ze względu na przechodzenie do pamięci / pamięci podręcznej, ale przechodzenie między rejestrami może równie dobrze być jednym cyklem (nie trzeba czekać na innych etapach potoku) i dlatego warto je rozróżnić. Ale to nie wyjaśnia przeniesienia przeciwko kopiowaniu ...
JBRWilkinson

Zgoda. Rozważ np. Urządzenia wejściowe zamapowane w pamięci. Odczytanie lokalizacji źródłowej może ją zmodyfikować - np. Odrzucić element, który czytasz z kolejki sprzętowej, zastępując go kolejnym elementem w kolejce. To brzmi jak ruch, a nie kopia - źródło nie przechowuje już tych informacji, tylko miejsce docelowe. Procesor nie decyduje o tym zachowaniu, decyduje o nim urządzenie zmapowane w pamięci.
Steve314,

Języki asemblera używają mnemoników, które są „zorientowane na procesor”. Oznacza to, że wszystko nazywa się z perspektywy rejestrów procesora. Zatem „load” zwykle kopiuje wartość do rejestru, podczas gdy „store” zwykle kopiuje jedną z rejestru do pamięci. Jak zatem nazwać kopiowanie wartości z jednego rejestru do drugiego? „Move” to oczywisty wybór. Jeśli ta sama operacja mikrokodu wykonuje oba (jak w 68000), „ruch” jest bardziej ogólnym wyborem dla ładowania / przechowywania. „Kopiowanie” mogło zostać użyte, ale może być zbędne, ponieważ tak naprawdę nie ma czegoś takiego jak prawdziwy „ruch”, w którym źródło pozostaje puste.
DocSalvager,

@DocSalvage: Jeśli 32-bitowy rejestr to stała wiązka 32 klapek lub zatrzasków, które zawsze będą istnieć, „ruch” niekoniecznie ma sens. Jednak w architekturach ze zmianą nazw rejestrów operand „move”, który również unieważniałby źródło, mógłby poprawić wydajność poprzez zwolnienie rejestru wirtualnego. Nigdy nie słyszałem o takiej rzeczy, ale nie znam żadnych architektur zaprojektowanych z myślą o zmianie nazw rejestrów.
supercat

@ superupat: W sprzęcie komputerowym wszystkie rejestry i wszystkie lokalizacje pamięci zawsze zawierają wartość. W rzeczywistości nie ma czegoś takiego jak „zero” lub „pusty”. Stosujemy arbitralne konwencje, aby zaznaczyć, że zawartość rejestru lub pamięci jest nieprawidłowa. Bardzo często „0” oznacza „zero”, ale nie zawsze. Na przykład stan „zerowy” bloku pamięci może być wskazywany przez adresy początkowe i końcowe przechowywane w innym miejscu. Istnieje również wiele innych technik. Ostatecznie mnemoniki językowe są arbitralne, choć staramy się znaleźć najbardziej zrozumiałą opcję.
DocSalvager,

0

Z pewnością masz rację. Większość, jeśli nie wszystkie wystąpienia instrukcji mov są w rzeczywistości kopią.

Niektórzy nie mają nawet mova, dla którego jest to pseudo-instrukcja

add dest=source+zero.

Zrozum także, że składnia ascii jest dowolna, kod maszynowy coś znaczy, jest zdefiniowany i naprawiony dla tego procesora. Przez większość czasu, jeśli nie przez cały czas, twórca / dostawca procesora tworzy składnię częściowo w celu zdefiniowania zestawu instrukcji (kodu maszynowego), a częściowo w celu zdefiniowania składni, która działa z narzędziem, które również utworzyli lub zlecili konwersji tego języka asemblera na maszynę kod dla ich procesora. Z pewnością możesz na przykład przejść do asemblera gnu (który ma tendencję do robienia własnych rzeczy i nie postępować zgodnie ze składnią dostawców procesorów) i dodać kopię pseudoinstrukcji.

Przypadki użycia: w dzisiejszych czasach większość kodu języka asemblera jest generowana przez kompilator, a instrukcja mov jest najczęściej używana do faktycznego przeniesienia wartości z jednego rejestru do drugiego, aby można było ponownie użyć rejestru źródłowego (lokalizacja pamięci itp.). Z powodu konwencji wywoływania dla tego procesora lub dlatego, że niektóre instrukcje lub zestawy instrukcji nie są ortogonalne, więc musisz się poruszać. Z pewnością zdarzają się sytuacje, w których pożądana jest kopia wartości i do wykonania tej kopii można użyć mov.

Wątpię, żebyśmy kiedykolwiek dowiedzieli się, która osoba lub zespół wymyśliła ten termin jako pierwszy i dlaczego wybrali przeniesienie zamiast kopii. Ponieważ przyzwyczailiśmy się do tego, zwykle używamy go z każdym nowym zestawem instrukcji. Jak już wspomniano, niektóre zestawy instrukcji wykorzystują ładowanie na podstawie rejestru i przechowują instrukcje, w których jeden operand jest rejestrem, a drugi jest adresem, i przenoszą tylko rejestr, aby zarejestrować przypadki. Inne zestawy instrukcji używają mov dla rejestru lub mem dla dowolnego operandu. Chociaż z pewnością możesz dodać kopię do dowolnego / wielu asemblerów open source, uzyskanie przyczepności przy jej użyciu będzie trudniejsze. Jeśli pracujesz w miejscu, w którym masz kontrolę nad oryginalną składnią (pracujesz nad miejscem, w którym robi się nowy procesor), w którym możesz dyktować rejestrowi rejestrację przeniesienia, nazywa się kopiowaniem,


-4

Zastąpienie instrukcji oznacza zerwanie z kompatybilnością wsteczną. Asembler z nową składnią nie będzie w stanie skompilować kodu napisanego przy użyciu starej składni - chyba że kod ten nie używa tej instrukcji (a jedynym miejscem, w którym zobaczysz kod asemblera, który nie używa, MOVsą przykłady składni które pokazują inne instrukcje ...)

Kompilatory zwykle generują kod asemblera i automatycznie przekazują go do asemblera, więc będą musiały zostać również zmodyfikowane, aby pasowały do ​​nowego asemblera. Jeśli język zezwala na asembler, stary kod źródłowy, który używa asemblera inline z MOVinstrukcjami, przestanie działać.

Mówimy więc o gigantycznym złamaniu kodu i po co? nie sprawi, że język nie będzie bardziej czytelny, ponieważ w przeciwieństwie do niektórych języków wysokiego poziomu, nie masz szansy powiedzieć, co robi kod asemblera bez znajomości asemblera, a jeśli znasz asembler, wiesz, co MOVrobi.

Ogromny koszt przy zerowym zysku łatwo wyjaśnia, dlaczego nazwa instrukcji nie została zmieniona.


3
Jak to odpowiada na zadane pytanie?
komar

2
Jedyne zdanie kończące się znakiem zapytania to „Ale dlaczego wciąż jest powszechnie stosowane, a nie zastępowane przez„ kopiuj ”lub„ przechowuj ”?
Idan Arye

2
Nie wyjaśnia, dlaczego na początku instrukcja została tak nazwana przez niezliczone ISA zaprojektowane od zera (tj. Bez ograniczeń kompatybilności wstecznej) przez wiele dziesięcioleci. Ponadto, jeśli sprzedawca chciałby zmienić mnemonik pomimo wstecznej kompatybilności, mógłby podać alias i promować jego użycie.

1
Co oznacza skrót „OP”? I nie widziałem prawdziwego wyjaśnienia.
Netch

1
Jestem oryginalnym plakatem i powiem, że kopiowanie między komórkami pamięci w S / 360 nie jest „nieco inną operacją”, ale jest jedynie specjalnym przypadkiem tego samego kopiowania. Pytanie jest nadal nierozwiązane.
Netch
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.