Neden kopyalama talimatı genellikle MOV olarak adlandırılıyor?


23

Birçok montajcıda, bir değer kopyalama talimatı genellikle "MOV" olarak adlandırılır ve kılavuzlardaki tanımı da genellikle "hamle" içerir (ancak "load", "store", "extract" gibi diğer kelimeler de kullanılabilir. () Bu sözleşmeye uymayan) bir ISA bulmak nadirdir .

Öte yandan, diğer bağlamlarda, "hamle" kaynağın tahrip olduğu anlamında "kopya" dan farklıdır (örneğin, Unix'deki "mv" vs. "cp", Norton Commander ve klonlardaki Taşı [F6] vb. ) Assembler'ın "hamlesi" gerçekten anlamsal "kopyaya" sahip, kaynak değerini sağlam tutuyor.

Bunun en azından IBM 1401'den (1959) beri başladığını buldum , ancak IBM 360 bu sözcüğü yalnızca depo içi kopyalama için kullandı, ancak kayıt defterleri ve depolama arasındaki işlemler için kullandı ("load" ve "store" kullandı) . Fakat neden hala yaygın olarak kullanılıyor ve "kopya" ya da "mağaza" ile değiştirilmiyor?


5
Wikipedia diyor ki : "Bu işlem için hareket kelimesi, kesinlikle konuşmakta, bir yanlış isimdir: Bir nesneyi A'dan B'ye taşıma, fiziksel olarak A ile boş yerlere dönme; A'daki nesnenin durumu ve bu işlemdeki eski B'nin üzerine yazılır. Bu, diğer bazı meclis dillerinde taşıma yerine load , store veya copy gibi kelimeler kullanılarak yansıtılır . "
Uwe Keim

@UweKeim hmm, Ben soru önce açıklama için googled ama bu makale ile beslenmedi. Her neyse, bu durum şu anki durumu açıklıyor ama gerçek kökenlere dair bir ipucu vermiyor ...
Netch

2
@gnat Bir ISA veri yolu değil, "Komut Dosyası Seti Mimarisi" demeyi kastediyordum. Yeniden düzenledim.
Netch

@ Netch teşekkürler! Her nasılsa , Wikipedia'daki
gnat

1
Asıl neden "kopya" yerine "taşıma" dendiğini anlamanın bir yolu olmadığından şüpheliyim, ancak spekülasyon eğlencelidir. Assembly dili için wikipedia sayfasında , MOV'u “verilerin kopyasını taşıma” işlemi olarak tanımlamaktadır, ki bu ilginç bir yorumdur. Bir başka olasılık, MOV'un gerçek kullanımları bakımından işlemin kavramsal olarak bir veri hareketi olmasıdır; Artık kaynağı umursamıyoruz.
Ben Lee

Yanıtlar:


10

Bazı komut kümelerinde, bir kaydı bellekten yüklemek, bir belleği belleğe kaydetmek veya kayıtlar arasında bir şey aktarmak için farklı talimatlar vardır. Bazı montaj dili formları her şey için "yük" fiilini kullanırken (örneğin, Zilog'un Z80 anımsatıcılarını kullanır).ld a,(1234h) , ld (1234h),ave ld a,b) ve (örneğin, "A transferi X" için TXA ile 6502) bazı kullanım "T" ransfer, bazı kullanım "hareket" Kayıt-kayıt işlemlerinin yüklerden ve mağazalardan ayırt edilmesi için. Kayıt yaptırmak, hafızaya kaydetmek, hafızaya kaydetmek ve hatta hafızadan hafızaya işlemler için aynı genel talimat formunu kullanan 68000 gibi bir talimat formatına sahipse, "hareket" fiili; Muhtemelen alternatiflerden herhangi birine göre daha iyi bir genel amaçlı fiil.

8080'den önce minibilgisayar veya ana bilgisayar komut setleri hakkında hiçbir fikrim yok, ancak 8080 çoğu hafıza erişim talimatı için "load" ve "store" ve kayıt yaptırmak için talimatlar için "mov" kullandı, ancak çoğu çalışan isteğe bağlı olarak 8-bitlik bir yazmaç, HL tarafından adreslenen bellek yeri olan "M" de çalışabilir, bu nedenle "M" den veya "M" den bir "MOV" gerçekten bir yük veya depo gibi davranırdı.

"Kopyala" ve "taşıma" arasındaki ayrımdan gelince, kodun kayıtları oluşturamayacağı ya da yok edemediği gerçeği ile ilgili olduğunu düşünüyorum; onlar sadece var. Kod dizisinin davranışını tarif ederken mov bx,ax / mov ax,1234, ilk komutun bx'i balta kopyaladığını söylemek daha mantıklı mı, ikinci komut ise değeri yok eder axve değeri 1234 ile değiştirir, ya da ilkini görüntülemek daha mantıklı olur mu? değeri bx'den baltaya dönüştürdüğü yönünden talimat (baltadaki değeri "umursamamak") ve ikinci komut 1234 ile baltayı (umursamadım) yüklüyor mu? Bazen kaynak kayıtları bir register-transfer komutundan sonra hala anlamlıdır, ancak komut setinde olacağını belirten hiçbir şey olmadığından,


Cevabınızı destekleyecek hiçbir kanıtım yok, ama kesinlikle doğru geliyor. Yükleme / Mağaza işlemleri, bellek / önbellek nedeniyle CPU / mikro kodda farklı bir yol izleyecektir, ancak kayıtlar arasında hareket etmek tek döngü olabilir (diğer boru hattı aşamalarında beklemeye gerek yoktur) ve bu nedenle farklılaşmaya değer olabilir. Ancak bu, kopyalamaya karşı kopyasını
açıklamıyor

Kabul. Örneğin hafıza eşlemeli giriş cihazlarını göz önünde bulundurun. Bir kaynak konumunu okumak, örneğin bir donanım kuyruğundan okuduğunuz öğeyi atmak, sıradaki bir sonraki öğeyle değiştirmek olarak değiştirebilir. Bu bir kopyadan ziyade bir harekete benziyor - kaynak artık bu bilgileri tutmuyor, sadece hedef yer alıyor. Bu davranışa CPU tarafından karar verilmez, bellek haritalı cihaz tarafından kararlaştırılır.
Steve314

Assembly dilleri "CPU merkezli" anıları kullanır. Yani, her şey CPU'nun kayıtları açısından adlandırılmıştır. Bu nedenle, "load" genellikle bir değeri bir register'a kopyalarken, "store" genellikle bir register'dan belleğe kopyalar. Öyleyse bir kayıttan diğerine bir değer kopyalamak için ne çağırmalı? "Taşı" açık bir seçimdir. Aynı mikro kod işlemi her ikisini de gerçekleştirirse (68000'deki gibi), "taşı" yükleme / saklama için daha genel bir seçimdir. "Kopyala" kullanılmış olabilir, ancak kaynağın boş bırakıldığı gerçek bir "hareket" gibi bir şey olmadığından fazlalık olabilir.
DocSalvager

@DocSalvage: Eğer 32 bitlik bir kayıtçı her zaman var olacak 32 flip flop veya mandalın sabit bir demetiyse, "hareket" mutlaka bir anlam ifade etmiyor. Bununla birlikte, kayıt adının değiştirildiği mimarilerde, kaynağı geçersiz kılacak olan bir "hamle" işleni, sanal bir kayıt defterini serbest bırakarak verimliliği artırabilir. Böyle bir şeyin yapıldığını hiç duymamıştım, ancak akılda kayıt yeniden adlandırma ile tasarlanan hiçbir mimariyi tanımıyorum .
supercat,

@supercat: Bilgisayar donanımında, tüm kayıt defterleri ve tüm bellek konumları her zaman bir değer içerir. Aslında "boş" veya "boş" diye bir şey yoktur. Kayıt veya bellek içeriğinin ne zaman geçersiz olduğunu belirtmek için keyfi sözleşmeler kullanıyoruz. Çok sık olarak, "0" ifadesinin "boş" ifadesine izin verir, ancak her zaman değil. Örneğin bir bellek bloğunun "boş" durumu, başka bir yerde saklanan adreslerin başlangıç ​​ve bitişi ile gösterilebilir. Başka birçok teknik de var. Sonuçta, dil hatırlatıcıları en yaygın şekilde anlaşılan seçenekten birini denememize rağmen keyfidir.
DocSalvager

0

Kesinlikle haklısın. Çoğu, bir mov komutunun tüm örnekleri aslında bir kopya değilse.

Bazıları aslında bir mov bile yok, bunun için sahte bir talimat.

add dest=source+zero.

Ayrıca, ascii sözdiziminin keyfi olduğunu da anlayın, makine kodu bir şey ifade eder ve bu işlemci için tanımlanmış ve sabittir. İşlemci oluşturan / satıcı, çoğu zaman komut setini (makine kodu) tanımlamak için kısmen, kısmen de bu montaj dilini makineye dönüştürmek için oluşturdukları veya görevlendirdikleri bir araçla çalışan bir sözdizimi tanımlamak için bir sözdizimi oluşturur. İşlemcileri için kod. Kesinlikle, örneğin, kendi başına bir şey yapma eğilimi olan ve işlemci satıcılarının sözdizimini izlemeyen bir eğilimde olan) gnu assembler'a girebilir ve bir kopya sözde talimatı ekleyebilirsiniz.

Durumları kullanın: Bugünlerde çoğu meclis dili kodu derleyicidir ve mov komutu en sık olarak bir değeri bir registerdan diğerine taşımak için kullanılır, böylece kaynak register (hafıza yeri, vb.) Tekrar kullanılabilir. Bu işlemcinin arama sözleşmesinin nedenlerinden dolayı veya bazı talimatlar veya komut setleri ortogonal olmadığından, etrafta hareket etmek zorundasınız. Kesinlikle bir değerin kopyasının istendiği zamanlar vardır ve mov bu kopyayı yapmak için kullanılabilir.

Cidden şüphe duyuyorum ki, ne terim ile ilk önce hangi birey veya ekibin ortaya çıktığını ve neden kopya üzerinde geçişi seçtiklerini öğreneceğiz. Alıştığımız için her yeni komut setinde tekrar kullanma eğilimindeyiz. Daha önce de belirtildiği gibi, bazı komut kümeleri sicile dayalı yük kullanır ve bir işlenenin bir sicil ve diğerinin bir adres olduğu talimatları saklar ve sadece sicil kayıt işlemine (s) kayıt olur. Ve diğer komut kümeleri, her iki işlenen için kayıt için mov veya mem kullanır. Açık kaynak kodlayıcıların herhangi birine / çoğuna kesinlikle kopya ekleyebilseniz de, kullanımıyla ilgili çekiş gücü elde etmek daha zor olacaktır. Orijinal sözdizimini kontrol edebileceğiniz bir yerde çalışıyorsanız (yeni bir işlemci yapan bir yer için çalışın), kayıt işlemini kayıt yapmak için dikte edebileceğiniz bir yere kopya denir,


-4

Bir talimatın değiştirilmesi geriye dönük uyumluluk kırılması anlamına gelir. Yeni sözdizimine sahip bir montajcı, eski sözdizimiyle yazılmış kodu bir araya getiremez - bu kod bu talimatı kullanmıyorsa (ve kullanmayan bir montaj kodu göreceğiniz tek yer MOVsözdizimi örneklerindedir) diğer talimatları gösteren ...)

Derleyiciler genellikle montaj kodu oluşturur ve otomatik olarak montajcıya geçirir, bu nedenle yeni montajcıya uyacak şekilde değiştirilmeleri gerekir. Bir dil satır içi derlemeye izin veriyorsa, satır içi assembler kullanan eski kaynak koduMOV talimatlarla artık çalışmaz.

Peki, devasa bir kod kırılmasından bahsediyoruz, peki ya ne için? dili daha okunaklı hale getirmez, çünkü bazı yüksek seviyeli dilin aksine, derleme bilmeden bir derleme kodunun ne yaptığını söyleme şansınız olmaz ve derlemeyi biliyorsanız ne yapılacağını bilirsiniz MOV.

Sıfır kazançlı büyük maliyet, talimatın neden yeniden adlandırılmadığını kolayca açıklar.


3
Bu soruyu soruyu nasıl cevaplıyor?
tatarcık

2
Bir soru işareti ile biten tek cümle 'Ama neden hala yaygın olarak kullanılıyor ve "kopya" ya da "mağaza" ile değiştirilmiyor?
Idan Arye

2
Talimatın neden bu kadar baştan adlandırıldığını, yıllarca sıfırdan (yani geriye dönük uyumluluk kısıtlamaları olmadan) tasarlanan sayısız ISA ile adlandırıldığını açıklamıyor. Ayrıca, bir satıcı geriye dönük uyumluluğa rağmen anımsatıcıyı değiştirmek isterse, bir takma ad sağlayabilir ve kullanımını teşvik edebilir.

1
"OP" ne anlama geliyor? Ve gerçek bir açıklama görmedim.
Netch

1
Orijinal poster benim ve S / 360'taki bellek hücreleri arasındaki kopyalamanın "biraz farklı bir işlem" olmadığını , sadece aynı kopyalamanın özel bir durum olduğunu belirteceğim . Soru hala çok çözümsüz.
Netch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.