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”?
Odpowiedzi:
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),a
ild 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śćax
i 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,źródło
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
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,
źródło
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,
MOV
są 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
MOV
instrukcjami, 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
MOV
robi.Ogromny koszt przy zerowym zysku łatwo wyjaśnia, dlaczego nazwa instrukcji nie została zmieniona.
źródło